昨天看了类,没总结,今天补一下。
1.类也是一种数据类型,我理解为多了成员函数的结构,是封装的基础,其内存大小同没有函数的结构,函数不占内存空间(应该是另外一片空间)。
2.不声明是公有保护还是私有成员的默认为私有。
3.成员函数一般分为两类,一类负责消息传递,一般暴露在公有成员中,另外一类操作数据成员,一般为私有或保护。
4.this指针不能显示说明,只能在非静态的成员函数中使用,在开始调用this时声明它指向当前的对象,直至函数结束时都不会改变指向,是常指针const。
5.构造函数和析构函数,构造函数在类创建时调用,一般用于初始化类的成员和申请内存空间,可重载,可带参数,不可有返回值;析构函数在类被删除时(可能是调用delete显示删除,也可能是函数结束时隐式删除)
6.复制构造函数
一般就是,类里添加一个变量为本类类型的别名的构造函数A(const A &p),大概就这样,然后在里面将数据复制,深复制还要申请新的内存空间,在‘=’和A a;A b(a);这两种情况时就会调用复制构造函数。这里要说一下别名形参,书上有个有趣的说法,说调用复制构造函数时会生成匿名对象p,这无疑就是你tm在逗我,别名形参其实就是直接操作实参,只不过加个马甲而已,不会生成新对象和新内存空间,书上的test结果难道是脑部出来的吗Orz...
class A
{
public:
A(int xx = 0, int yy = 0)
{
X = xx;
Y = yy;
cout << "a" << endl;
}
A(const A & p)
{
X = p.X;
Y = p.Y;
cout << "copy" << endl;
}
~A()
{
cout << "b" << endl;
}
private:
int X, Y;
};
A g()
{
A a(1, 2);
return a;
}
void main()
{
A b;
b = g();
system("pause");
}
结果如下:
a //创建对象b
a //创建对象a
copy //执行复制构造函数
b //删除对象a
b //删除对象b
7.类的常成员
常数据成员,初始化
class A
{
public:
const int a,b;
A():a(10),b(10){}; //a括号里的不一定是具体数值,也可以是外部决定的,通过构造函数传入
};
常成员函数,const限制了该函数的this指针,也就是说它不能修改类的数据成员
8.静态成员,可以用A::a、A::a()来初始化和调用
9.友元,可以是类,也可以是函数,只是把类本身暴露给友元,但友元并不属于类,与类的关系只是可调用,友元关系是非对称的,不可传递的,友元类一般用于消息传递
10.类的包含,要注意的是什么时候创建什么时候delete就好了