<pre name="code" class="cpp">//①静态对象成员
#include <iostream>
using namespace std;
class A
{
public:
A() { cout << "A's Constructor Called " << endl; }
};
class B
{
public:
B() { cout << "B's Constructor Called " << endl; }
static A a;
};
A B::a;//如果没有这个,则下面的B b不会调用A的构造函数
int main()
{
B b;//a的构造函数在main函数之前就访问了,b的现在才会调用构造函数
B::a;//能正常访问
return 0;
}
//解释:上面的程序只是调用了B的构造函数,没有调用A的构造函数。
//因为静态成员变量只是在类中声明,没有定义。
//静态成员变量必须在类外使用作用域标识符显式定义。
//②联合体和枚举
#include <iostream>
using namespace std;
union
{
int i;
char x[2];
}a;
class A
{
enum{a,b,c,d};
};
class B
{
enum{a,b,c,d}C;
};
int main()
{
cout<<"sizeof(A):"<<sizeof(A)<<endl;//输出1
cout<<"sizeof(B):"<<sizeof(B)<<endl;//输出4
a.i = 0; //00 00 00 00
a.x[0] = 10; //0a 00 00 00
a.x[1] = 1; //0a 01 00 00
//a小端字节序 a = 0x010a = 266
cout<<"a.i:"<<a.i<<endl;
return 0;
}
//③下面代码不会报错?
class A {
public:
int m;
void print() { cout << "A\n"; }
};
//上面的void print();---->void print(A * const this);
int main()
{
A *pa = 0;
pa->print();//相当于print(pa)
return 0;
}
//并不是类没有初始化就不能调用类的成员函数.
//如果成员函数只是简单的打印个东西,没有调用类成员啥的就不会报段错误。
//返回值加const修饰的必要性
//你觉得下面两种写法有区别吗?
A GetA(void);
const A GetA(void);
//答案:没有任何区别。
//解释:如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。所以,对于值传递来说,加const没有太多意义。
//所以:
//不要把函数A GetA(void) 写成const A GetA(void)。
//当然 如果是返回引用,那就不一样了。