sizeof (A) = 1;
p->Print()只是传了一个 A 类型的 this 指针访问的是公共区域的 Print() 函数,并没有用 this 解引用,所以左边程序正常运行,而右边通过 this 指针解引用访问了私有成员 a 而 this (也就是传进来的 p ) 为 nullptr ,解引用会崩溃,所以右边程序运行崩溃。
构造函数
d1是默认构造不带函数参数的调用 后面不能带()
d2是默认构造带函数参数的调用 [ 可支持重载 ]
B A D C
1、类的析构函数调用一般按照构造函数调用的相反顺序进行调用,但是要注意static对象的存在, 因为static改变了对象的生存作用域,需要等待程序结束时才会析构释放对象
2、全局对象先于局部对象进行构造
3、局部对象按照出现的顺序进行构造,无论是否为static
4、所以构造的顺序为 C A B D
5、析构的顺序按照构造的相反顺序析构,只需注意static改变对象的生存作用域之后,会放在局部 对象之后进行析构
6、全局变量最后析构
拷贝构造函数
date d1;
拷贝构造:date d2 (d1) or date d2 = d1 ;
深拷贝与浅拷贝(值拷贝)
浅拷贝:按字节拷贝
对于特殊类用深拷贝:
初始化列表:
在类外进行定义:int A : : _scount = 1 ;
这两行代码等价
A a(1,2);
st.push(a);
st.push({1,2})
隐式类型转换不仅支持单参数构造,还有多参数;
类成员函数没有 this 只能访问静态成员
class A
{
public:
static int func()
{
return _a;//错误
return _b;//正确
}
private:
int _a;
static int _b;
}
int A:: _b = 1;//正确
static int A::_b = 1;//错误
内部类
里面的类可以访问外面的类;
友元类
class A
{
friend class B
}
B可以访问A的私有成员
连续拷贝构造,编译器的优化
不优化的情景