深度探索c++学习笔记
2012-05-30 18:20
513 查看
D d1 = d; 这个是调用的是复制构造函数
函数参数是以copy constructor初始化的
Default constructor的错误认为:(P47)
任何class如果没有定义default constructor,就会被合成一个出来,其实不是.(要有四种之一,带有default constructor的member class object或base class或带有一个virtual function的class或者带有一个virtual base class 的class)
编译器合成出来的default constructor会现实定义”class内每一个data member的默认值”,其实不是.(一些内置类型是不会的)
Default copy也是有上述四种情况才会自动生成的
带有default constructor的member class object
class B{
public:
B(){
cout << "B" << endl;
}
};
class D{
public:
D(){
}
private:
int c;
B b;
};
带有default constructor的base class
int main(){
D d; 输入B,编译器会自动添加B的初始化(在D构造函数中加),但是会初始话c
cout << d.c;
return 0;
}
class B{ 与上面的返回值一样
public:
B(){
cout << "B" << endl;
}
};
class D: public B{
public:
D(){
}
int c;
};
int main(){
D d;
cout << d.c;
return 0;
}
enum n{N,M,K,J,L};
cout << sizeof(n) << endl; //输出4
class B{
public:
virtual void x(){
cout << "call B virtual x()" << endl;
}
};
class D: public B{
public:
void x(){
cout << "call D virtual x()" << endl;
}
};
int main(){
B *b = new D;
(*b).x();
返回的还是D类中的x();
在下列情况下你必须使用member initialization list:
当初始化一个reference member时;
当初始化一个const member时;
当调用一个base class的constructor,而它拥有一组参数时
当调用一个member class的constructor,而它拥有一组参数时
class X{
};
class Y: virtual public X{};
class Z: virtual public X{};
class T: public Y, public Z{};
int main(){
cout << "X: " << sizeof(X) << endl; //1
cout << "Y: " << sizeof(Y) << endl; //4
cout << "Z: " << sizeof(Z) << endl; //4
cout << "T: " << sizeof(T) << endl; //8
X x;
Y y;
Z z;
T t;
cout << "x: " << sizeof(x) << endl;
cout << "y: " << sizeof(y) << endl;
cout << "z: " << sizeof(z) << endl;
cout << "t: " << sizeof(t) << endl;
return 0;
}
class X{
};
class Y: virtual public X{};
class Z: virtual public X{};
class T: public Y, virtual public Z{};
int main(){
cout << "X: " << sizeof(X) << endl; //1
cout << "Y: " << sizeof(Y) << endl; //4
cout << "Z: " << sizeof(Z) << endl; //4
cout << "T: " << sizeof(T) << endl; //8
X x;
Y y;
Z z;
T t;
cout << "x: " << sizeof(x) << endl;
cout << "y: " << sizeof(y) << endl;
cout << "z: " << sizeof(z) << endl;
cout << "t: " << sizeof(t) << endl;
return 0;
}
class X{
};
class Y: virtual public X{};
class Z: virtual public X{};
class T: virtual public Y, virtual public Z{};
int main(){
cout << "X: " << sizeof(X) << endl; //1
cout << "Y: " << sizeof(Y) << endl; //4
cout << "Z: " << sizeof(Z) << endl; //4
cout << "T: " << sizeof(T) << endl; //12
X x;
Y y;
Z z;
T t;
cout << "x: " << sizeof(x) << endl;
cout << "y: " << sizeof(y) << endl;
cout << "z: " << sizeof(z) << endl;
cout << "t: " << sizeof(t) << endl;
return 0;
}
Data Member绑定
typedef int length;
class X{
public:
void mumble(length val){ _val = 1.1;} //这里的length是global的
length mumble(){return _val;} //这里的length也是global的
public:
typedef float length;
length _val; //class的
};
int main(){
X x;
x.mumble(1.1);
cout << x.mumble() << endl; //1
cout << x._val << endl; //1.1
return 0;
}
如果想要typedef int length是class内的就要在类的开始定义就好,但是类内成员变量就不会有这问题
class X{
public:
static int l;
float x;
};
class Y : public X{
};
int X::l = 10;
int main(){
cout << X::l << endl; //10
cout << Y::l << endl; //10
X::l = 11;
cout << Y::l << endl; //11 因为X,Y是共享存储在data segment的l
return 0;
}
P103
class X{
private:
int l;
char a;
char b;
};
int main(){
cout << "sizeof(X):" << sizeof(X) << endl; //8
return 0;
}
class X{
public:
int l;
char a;
};
class Y: public X{
public:
char b;
};
int main(){
cout << "sizeof(Y):" << sizeof(Y) << endl; //12 原因X的补充不会与Y相连
return 0; 想想X x; Y y; x = y,如果是相连的话会使x中有个未知的b成员变量在最后
}
class B{
public:
virtual void func();
};
class D: virtual public B{
public:
virtual void fun();
};
int main(){
cout << "sizeof(B):" << sizeof(B) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //12自己也有一个虚table指针,一个指向
return 0; B的指针,还有就是B父类的大小
}
class B{
public:
virtual void func();
};
class D: virtual public B{
};
int main(){
cout << "sizeof(B):" << sizeof(B) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //8 一个指向B的指针,还有就是B的大小
return 0;
}
class B{
public:
virtual void func();
};
class D: public B{
public:
virtual void fun();
};
int main(){
cout << "sizeof(B):" << sizeof(B) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //4 只有一个虚table指针
return 0;
}
class B{
public:
static void func() const; //错误,const 函数不能是static因为const指代
}; 对象中的成员变量不能改变,但是static是类层次的
编译器会将member function 转换成为一个独一无二的nonmember function
class B{
public:
virtual B* func() const;
};
class D: virtual public B{
public:
virtual D* func() const; //虽然D*返回的类型与B*不一样,但是有继承
}; 关系,所以这个虚拟继承是符合的
class B1{
public:
virtual B1* func() const{}
};
class B2{
public:
virtual B2* func() const{}
};
class D: public B1, public B2{
};
int main(){
cout << "sizeof(B1):" << sizeof(B1) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //8因为D会有两个vptr,分别指向两个子类
return 0;
}
单一继承:
多重继承:
虚拟继承:
函数参数是以copy constructor初始化的
Default constructor的错误认为:(P47)
任何class如果没有定义default constructor,就会被合成一个出来,其实不是.(要有四种之一,带有default constructor的member class object或base class或带有一个virtual function的class或者带有一个virtual base class 的class)
编译器合成出来的default constructor会现实定义”class内每一个data member的默认值”,其实不是.(一些内置类型是不会的)
Default copy也是有上述四种情况才会自动生成的
带有default constructor的member class object
class B{
public:
B(){
cout << "B" << endl;
}
};
class D{
public:
D(){
}
private:
int c;
B b;
};
带有default constructor的base class
int main(){
D d; 输入B,编译器会自动添加B的初始化(在D构造函数中加),但是会初始话c
cout << d.c;
return 0;
}
class B{ 与上面的返回值一样
public:
B(){
cout << "B" << endl;
}
};
class D: public B{
public:
D(){
}
int c;
};
int main(){
D d;
cout << d.c;
return 0;
}
enum n{N,M,K,J,L};
cout << sizeof(n) << endl; //输出4
class B{
public:
virtual void x(){
cout << "call B virtual x()" << endl;
}
};
class D: public B{
public:
void x(){
cout << "call D virtual x()" << endl;
}
};
int main(){
B *b = new D;
(*b).x();
返回的还是D类中的x();
在下列情况下你必须使用member initialization list:
当初始化一个reference member时;
当初始化一个const member时;
当调用一个base class的constructor,而它拥有一组参数时
当调用一个member class的constructor,而它拥有一组参数时
class X{
};
class Y: virtual public X{};
class Z: virtual public X{};
class T: public Y, public Z{};
int main(){
cout << "X: " << sizeof(X) << endl; //1
cout << "Y: " << sizeof(Y) << endl; //4
cout << "Z: " << sizeof(Z) << endl; //4
cout << "T: " << sizeof(T) << endl; //8
X x;
Y y;
Z z;
T t;
cout << "x: " << sizeof(x) << endl;
cout << "y: " << sizeof(y) << endl;
cout << "z: " << sizeof(z) << endl;
cout << "t: " << sizeof(t) << endl;
return 0;
}
class X{
};
class Y: virtual public X{};
class Z: virtual public X{};
class T: public Y, virtual public Z{};
int main(){
cout << "X: " << sizeof(X) << endl; //1
cout << "Y: " << sizeof(Y) << endl; //4
cout << "Z: " << sizeof(Z) << endl; //4
cout << "T: " << sizeof(T) << endl; //8
X x;
Y y;
Z z;
T t;
cout << "x: " << sizeof(x) << endl;
cout << "y: " << sizeof(y) << endl;
cout << "z: " << sizeof(z) << endl;
cout << "t: " << sizeof(t) << endl;
return 0;
}
class X{
};
class Y: virtual public X{};
class Z: virtual public X{};
class T: virtual public Y, virtual public Z{};
int main(){
cout << "X: " << sizeof(X) << endl; //1
cout << "Y: " << sizeof(Y) << endl; //4
cout << "Z: " << sizeof(Z) << endl; //4
cout << "T: " << sizeof(T) << endl; //12
X x;
Y y;
Z z;
T t;
cout << "x: " << sizeof(x) << endl;
cout << "y: " << sizeof(y) << endl;
cout << "z: " << sizeof(z) << endl;
cout << "t: " << sizeof(t) << endl;
return 0;
}
Data Member绑定
typedef int length;
class X{
public:
void mumble(length val){ _val = 1.1;} //这里的length是global的
length mumble(){return _val;} //这里的length也是global的
public:
typedef float length;
length _val; //class的
};
int main(){
X x;
x.mumble(1.1);
cout << x.mumble() << endl; //1
cout << x._val << endl; //1.1
return 0;
}
如果想要typedef int length是class内的就要在类的开始定义就好,但是类内成员变量就不会有这问题
class X{
public:
static int l;
float x;
};
class Y : public X{
};
int X::l = 10;
int main(){
cout << X::l << endl; //10
cout << Y::l << endl; //10
X::l = 11;
cout << Y::l << endl; //11 因为X,Y是共享存储在data segment的l
return 0;
}
P103
class X{
private:
int l;
char a;
char b;
};
int main(){
cout << "sizeof(X):" << sizeof(X) << endl; //8
return 0;
}
class X{
public:
int l;
char a;
};
class Y: public X{
public:
char b;
};
int main(){
cout << "sizeof(Y):" << sizeof(Y) << endl; //12 原因X的补充不会与Y相连
return 0; 想想X x; Y y; x = y,如果是相连的话会使x中有个未知的b成员变量在最后
}
class B{
public:
virtual void func();
};
class D: virtual public B{
public:
virtual void fun();
};
int main(){
cout << "sizeof(B):" << sizeof(B) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //12自己也有一个虚table指针,一个指向
return 0; B的指针,还有就是B父类的大小
}
class B{
public:
virtual void func();
};
class D: virtual public B{
};
int main(){
cout << "sizeof(B):" << sizeof(B) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //8 一个指向B的指针,还有就是B的大小
return 0;
}
class B{
public:
virtual void func();
};
class D: public B{
public:
virtual void fun();
};
int main(){
cout << "sizeof(B):" << sizeof(B) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //4 只有一个虚table指针
return 0;
}
class B{
public:
static void func() const; //错误,const 函数不能是static因为const指代
}; 对象中的成员变量不能改变,但是static是类层次的
编译器会将member function 转换成为一个独一无二的nonmember function
class B{
public:
virtual B* func() const;
};
class D: virtual public B{
public:
virtual D* func() const; //虽然D*返回的类型与B*不一样,但是有继承
}; 关系,所以这个虚拟继承是符合的
class B1{
public:
virtual B1* func() const{}
};
class B2{
public:
virtual B2* func() const{}
};
class D: public B1, public B2{
};
int main(){
cout << "sizeof(B1):" << sizeof(B1) << endl; //4
cout << "sizeof(D):" << sizeof(D) << endl; //8因为D会有两个vptr,分别指向两个子类
return 0;
}
单一继承:
多重继承:
虚拟继承:
相关文章推荐
- 深度探索C++对象模型学习笔记——Function语意学
- 深度探索c++对象模型 学习笔记 chapter2-1 default constructor
- 深度探索c++对象模型学习笔记
- Android深度探索:HAL与驱动开发学习笔记--中断
- Android深度探索:HAL与驱动开发学习笔记--内存管理(学习重点)
- 吴恩达老师深度学习视频课笔记:单隐含层神经网络公式推导及C++实现(二分类)
- 深度探索C++对象模型复习和学习 第二章:构造函数语义学(The Semantics of Constructors)
- 深度探索C++对象模型 Function语意学笔记
- Android深度探索:HAL与驱动开发学习笔记--并发控制之顺序锁
- Android深度探索:HAL与驱动开发学习笔记--时间管理
- boolan——c++学习笔记之容器探索
- 深度探索C++对象模型复习和学习 第三章 Data 语义学(The Semantics of Data )
- 深度探索C++对象模型 Data语意学笔记
- Android深度探索:HAL与驱动开发学习笔记--并发控制之信号量&完成量
- 深度探索C++对象模型学习 之 C++构造函数语意学(一)
- 读书笔记-深度探索C++对象模型-Chapter4
- 深度探索C++对象模型之C++对象模型笔记
- Android深度探索:HAL与驱动开发学习笔记--等待队列
- 深度探索C++对象模型复习和学习 第七章:站在对象模型的尖端
- 深度探索C++对象模型复习和学习 第四章:Function 语意学 (The Semantics of Function)