对象
2016-03-21 11:43
369 查看
[b]一.new 分配时会调用相应构造函数,malloc不会[/b]
[b] 同理delete[/b]
[b] new T; delete T;[/b]
[b] new T[]; delete[] T;[/b]
[b]二.static变量属于类本身,不属于任何对象[/b]
[b] static函数只能访问static成员[/b]
[b]三.this(指向成员函数作用的对象)[/b]
this不能作为赋值,递增,递减只有在非static成员函数才有效
static成员函数不具体作用于某个对象,真实的参数个数就是程序中写出的参数个数
[b]四.若函数f中有一个对象参数obj标记为const,则在f中调用obj的任何非const成员都是错误的。[/b]
[b]五.成员对象和封闭类[/b]
成员对象:一个类的成员变量是另一个类的对象
包含成员对象的类,叫封闭类
定义封闭类的构造函数时,添加初始化列表
成员对象初始化列表中的参数:任意复杂的表达式,函数/变量/表达式中的函数,变量有定义
当封闭类对象生成时:执行所有成员对象的构造函数,再执行封闭类的构造函数
成员对象构造函数的调用顺序和成员对现在类中的说明顺序一致,与在初始化列表中出现顺序无关
封闭类对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数
[b]六.对象的内存分配[/b]
对象大小=所有成员变量大小之和
一个对象的某个成员变量被改变,不会影响其他对象
类中不能定义自身对象,可定义指针对象和引用对象
[b]七.对象大小[/b]
空类同样被实例化,每个实例在内存中都有一个独一无二的地址,为达到这个目的
虚函数表4个字节
sizeof(类)=sizeof(非static成员变量)+4*(有无虚函数?1:0)
[b] 同理delete[/b]
[b] new T; delete T;[/b]
[b] new T[]; delete[] T;[/b]
[b]二.static变量属于类本身,不属于任何对象[/b]
[b] static函数只能访问static成员[/b]
#include<iostream> using namespace std; class A { public: static int s; static void ABC(){cout << 2 << endl;}; }; int A::s = 1; int main() { A a, *p = new A(); cout << a.s << endl;//1 cout << A::s << endl;//1 cout << p->s << endl;//1 cout << sizeof(A) << endl;//1 a.ABC();//2 A::ABC();//2 p->ABC();//2 return 0; }
[b]三.this(指向成员函数作用的对象)[/b]
this不能作为赋值,递增,递减只有在非static成员函数才有效
static成员函数不具体作用于某个对象,真实的参数个数就是程序中写出的参数个数
#include<iostream> using namespace std; class C { public: int a; void set(int p); }; void C::set(int p) { a = p; } int main() { C c; c.set(200); return 0; } 等价于 struct C { int p; }; void set(struct C *this, int p) { this->p = p; } int main() { struct C c; set(&c, 200); return 0; }
#include<iostream> using namespace std; class A { int i; public: void h() { cout << "1"; } /* void h(A *this) { cout << "1"; } */ void g() { cout << i << "hello"; } /* void g(A *this) { cout << this->i << "hello"; } */ }; int main() { A *p = NULL; p->h();//ok, 1 //p->g();error,空指针 return 0; }
[b]四.若函数f中有一个对象参数obj标记为const,则在f中调用obj的任何非const成员都是错误的。[/b]
[b]五.成员对象和封闭类[/b]
成员对象:一个类的成员变量是另一个类的对象
包含成员对象的类,叫封闭类
定义封闭类的构造函数时,添加初始化列表
类名::构造函数(参数表) :成员变量1(参数表), 成员变量2(参数表) { }
成员对象初始化列表中的参数:任意复杂的表达式,函数/变量/表达式中的函数,变量有定义
当封闭类对象生成时:执行所有成员对象的构造函数,再执行封闭类的构造函数
成员对象构造函数的调用顺序和成员对现在类中的说明顺序一致,与在初始化列表中出现顺序无关
封闭类对象消亡时,先执行封闭类的析构函数,再执行成员对象的析构函数
[b]六.对象的内存分配[/b]
对象大小=所有成员变量大小之和
一个对象的某个成员变量被改变,不会影响其他对象
#include<iostream> using namespace std; class CSample { public: CSample() { cout << "1" << endl; } CSample(int n) { cout << "2" << endl; } }; int main() { CSample c1[2];//1 1 CSample c2[2] = {4, 5};//2 2 CSample c3[2] = {3};//2 1 CSample *c4 = new CSample[2];//1 1 return 0; }
#include<iostream> using namespace std; class CSample { public: CSample() { cout << "1" << endl; } CSample(int n) { cout << "2" << endl; } CSample(int n, int m) { cout << "3" << endl; } }; int main() { CSample c1[3] = {1, CSample(1, 2)};//2 3 1 CSample c2[3] = {CSample(1, 2), CSample(3, 4), 1};//3 3 2 CSample *c4[3] = {new CSample(4), new CSample(1, 2)};//2 3 return 0; }
类中不能定义自身对象,可定义指针对象和引用对象
[b]七.对象大小[/b]
空类同样被实例化,每个实例在内存中都有一个独一无二的地址,为达到这个目的
class A{}; sizeof(A);//1
class A{int a;}; sizeof(A);//4
class A { A(int a) { this->a = a; } int a; }; sizeof(A);//4
class A { A(int a) { this->a = a; } virtual void x(){}; virtual void y(){}; int a; }; sizeof(A);//8
虚函数表4个字节
sizeof(类)=sizeof(非static成员变量)+4*(有无虚函数?1:0)
class A { virtual void x(){}; int a; }; class B: public A { int a; }; class C: public A, public B { int a; }; sizeof(B);//12 sizeof(C);//24 sizeof(C) = sizeof(A) + sizeof(B) + sizeof(C)
相关文章推荐
- [How to]如何通过xib来自定义UIViewController
- 2016.03.21 java web摘抄
- Android更改桌面应用程序launcher的两种方式
- FormAuthenticationFilter无效的解决方案
- iOS-OC-NSString和NSMutableString用法大全
- Java面试题全集(上)
- CanvasRenderingContext2D.createPattern()
- UITableView beginUpdates和endUpdates-实现UITableView的动画块
- webview总结
- VS2010中添加lib库引用
- Oracle自增ID实现
- 时间复杂度和空间复杂度详解
- 浅谈Java中的hashcode方法
- Java并发编程(一)——线程
- [BZOJ4034][HAOI2015]树上操作(链剖+dfs序)
- Android TextView特殊效果
- 排序算法之插入排序
- 第八章 网络的时代—网络开发(3)
- 面试贴:java异常小结
- jmock2.5基本教程(转)