概述
类的课程学习到此就告一段落,总的说来类还是挺容易上手的,就是有很多的理论,这些理论简而言之就是一些编写代码的规则,理解清楚后一切都不是问题。
下面我就着重说一下关于class的学习总结
一、 定义
class与struct大体上的使用方法相同,只是class中的数据默认为private(私有),而struct默认为public(公有)。其目的是为了保护数据。例如:
class X{
char c;//默认为私有
public://以下数据为公有
double a;
int b;
}
二、 this指针
这玩意咋说呢我是感觉用处不大,但是有些地方不用它还真不好弄,我就稍微拉拉它的一些用处吧。
1. 区分与局部变量重名的数据成员。
2. 返回当前类型。(我很多时候使用这个功能)
3. 获取当前对象的地址。
使用方法代码如下:
class X{
int m;
public:
void set(int m){
this->m=m;//this->m中的m指的是当前对象的数据成员m,而后面的赋值m为形参,也可以写成m=m;
}
X& add(const X& a){
m+=a.m;
return *this;//this是指针加*取内容,含义是返回当前对象
}
void copy(const X& a){
if(this==&a)//&a是取对象的地址,this是当前对象的地址,用判断地址是否相同来确定是不是一个对象;
return;
else
m=a.m;
}
};
知识点:加入我们定义一个class X{……},则X类的this指针的类型是X*。this指针是个常量,含有当前实施调用的对象的地址。不能改变this指针的值,也不能取this指针的地址。
三、 访问器(getXX)和修改器(setXX)
定义:被用来修改private数据成员的public类型的成员函数被称为修改器,访问器同理。
例如以下代码:
class X{
double a;
double b;
public:
double getxx(){
return a;//return b;这就是访问器
}
void setxx(double c){
if(c>0)
b=c;//a=c;这就是修改器,简单吧!
}
};
这两个的函数虽然简单但不可或缺,可以更好地保护数据,体现其封装性。同时在修改器中还可以用if判断语句进行新数据的检验,确保有效性。
四、 友元函数
这个东西就好说了,就是在成员函数前加一个friend。定义的友元函数可以访问并修改私有的数据成员,不过老师说尽量少用,用会破坏类的封装性。我感觉也是,本意是隐藏数据再给它弄成“公有”,还有啥个劲。但是有时候调程序总是因为私有成员而出错的话,不妨弄一个友元函数,顿时神清气爽。我一般会把自定义排序函数(cmp)定义成友元函数,不然的话对大量私有数据进行排序会成为一个不小的问题。
一个下面有个友元函数的简单使用希望有助于大家的理解:
class X{
double a;
double b;
X(int c=0):a(c),b(c){}
friend X add(const X&,const X&);//因为add函数调用了私有数据,不设置为友元函数无法访问。
};//构造函数进行初始化,后面会讲到。
X add(const X& a,const X& b){
X c;
c.a=a.a+b.a;
c.b=a.b+b.b;
return c;
}
五、 构造函数与析构函数
这两个东西是必不可少的,构造函数进行赋初值,而析构函数则负责在销毁对象后对对象的相关资源进行清理。
先说构造函数
- 构造函数最起码有两个,一个有参数的与一个无参数的。(重载函数)
- 构造函数的名字与类的名字相同,没有返回类型。
构造函数的初始化列表(尽量使用这个,效率更高)
注意: - 构造函数的初始化列表位于构造函数的参数表之后,函数体之前。
- 成员初始化顺序与它们在类中定义的顺序相同。
- 尽量避免用某些成员初始化其他成员。
例如:
class X{
int m;
int &r;
public:
X():m(0),r(m){}
X(int v):m(v),r(v){}
};
六、 委托构造函数
当一个类中定义多个构造函数时,其中一个构造函数可以调用另一个构造函数来完成自己的任务,这就是委托构造函数。不好阐述用代码说话吧。
#include<iostream>
using namespace std;
class X{
public:
X(int aa,int bb,int cc):a(aa),b(bb),c(cc)//(1)
{cout<<"初始化1";}
X(int aa,int bb):X(aa,bb,0)//(2);调用(1)初始化
{cout<<"初始化2";}//
X(int aa):X(aa,0,0)//(3);调用(1)初始化
{cout<<初始化3";}
X():X(1.1)//(4);调用(2)初始化,(2)又调用(1)初始化
{c=1;cout<<初始化3";}
private:
int a,b,c;
};
int main()
{
X one(1,2,3);
X two(1,2);
X three(1);
x four;
七、 析构函数
在某个对象生存期结束时返回相关资源和自动释放资源。当对象离开作用域时,或者用delete释放在堆上创建的对象时,析构函数都会被自动调用。
- 析构函数的名字是类名字前加波浪线“~”。
- 析构函数没有返回类型,也没有任何参数。
- 析构函数不能重载,唯一一个。
- 析构函数在大多数情况下都是被自动的隐式调用,一般不要显式的调用析构函数。
显式调用:
Int main()
{
X obj;
obj.~X();
}
注意:显式调用的话析构函数会被执行两次。
使用代码如下:
class X{
public:
~X();//析构函数
private:
……
};
X::~X(){
withdraw(getbalance());
delete pa;//释放pa指向的动态空间
}
八、const成员
const可以限定类中的数据成员,将其设定为常量。const数据成员在构造函数的初始化列表中初始化,一旦初始化后在对象的整个生存期都不可改变。
定义方法为:在数据成员前加const即可。
1.若需要用函数查看const数据成员,那么函数前也需要加const。
2.一个类的对象也可以用const限定,被限定的对象只可以进行访问,但是不可以进行修改。访问函数需要加上const。代码如下:
Int get() const { return m;}
注意:只有const成员函数才可以被const对象调用,const对象不能调用非const成员函数,但是非const对象可以调用const成员函数。
例如以下代码:
class X{
int m;
public:
X(int v=0):m(v){}
X():m(0){}
void set(int v){m=v;}
int get() const { return m;}
};
……
const X b(5);
b.get();正确
b.set(10);//错误const对象的数据无法修改
九、static成员(静态)
定义:属于整个类,但不属于某个对象,一个类的所有对象都可以访问这个数据。例如在QQ上建立一个群,可以定义一个static类型的数据成员,对群里面的人员计数。
具有以下优势:
- 静态数据成员没有进入程序的全局作用域,只是在类作用域中,因而不会与全局域中的名字产生冲突。
- 可以实现数据隐藏,静态成员可以是private成员。
使用代码如下:
class Object{
static int count;
public:
Object(){count++;}
~Object(){count--;}
int getcount() const {return count;}
};
int Object::count=0;
初始化问题:
静态数据应该在类定义之外初始化,定义时要使用类名字限定静态成员名,代码如下:
int Object::count=0;
注意:static成员只能定义一次,一般放在包含成员函数定义的源文件中。
类中的常量——static const成员
例如:银行允许创建联名账户,但是最对两个人,代码如下:
class Object{
static const int maxren;
public:
……
};
const int Object::maxren=2;
Static const数据成员的定义和static一样在类外,但是类外定义时要加const。虽然c++允许整型数据可以在类内定义,但是为了一致性,都在类外定义。
静态数据的访问
在类的静态函数中可以直接访问静态数据成员。但是在非成员函数中,可以通过一下两种方式访问静态数据成员。
- 成员访问运算符“.”和“->”,通过对象和指针访问。
- 用类名字限定的静态成员名字访问。
代码如下:
class Object{
static int count;
friend void func(Object& obj);
};
void func(Object& obj)
{
cout<<obj.count;
cout<<Object::count;
}
Static成员函数
- 用普通成员函数访问静态数据成员。
- 用静态成员函数来访问静态数据成员。
调用方式:
Object obj;
obj.getcount();
Object::getcount();
最后
以上就是怕孤独夏天为你收集整理的关于class的学习总结的全部内容,希望文章能够帮你解决关于class的学习总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复