初始化列表 initialize list
在构造函数的括号后面加上 :
然后写上成员变量的名字,在括号里给出成员变量的初始值
A():p(0){ cout << "A::A()" << endl; } // 初始化列表
这个操作会早于构造函数的执行
#include<iostream>
using namespace std;
struct A{
int i;
int *p;
public:
// A(){ p=0; cout << "A::A()" << endl; }
A():p(0){ cout << "A::A()" << endl; } // 初始化列表
~A() { if (p) delete p; cout << "A::~A()" << i << endl; }
void set(int ii) { i = ii; }
void f() { p = new int ; }
void g(A* q) {cout << "A::g(), q->i=" << q->i << endl; }
};
int main(){
A* p = new A[10];
for ( int i =0; i<10; i++)
p[i].set(i);
A b;
b.set(100);
p[0].g(&b);
delete[] p;
}
-
可以初始化任何数据类型
-
使用初始化列表初始化数据会早于构造函数的执行
-
只做一件事,初始化
而放在大括号里 需要两件事初始化和赋值
如果是对象的话,放在大括号里面,对象会先调用default-constructor初始化。如果你没有default-constructor的话,则会报错
#include<iostream> using namespace std; class B{ public: B(int i){} // B(){} }; struct A{ int i; int *p; B b; public: A():p(0) { b=0; cout << "A::A()" << endl; } ~A() { if (p) delete p; cout << "A::~A()" << i << endl; } void set(int ii) { i = ii; } void f() { p = new int ; } void g(A* q) {cout << "A::g(), q->i=" << q->i << endl; } }; int main(){ A* p = new A[10]; for ( int i =0; i<10; i++) p[i].set(i); A b; b.set(100); p[0].g(&b); delete[] p; }
-
类里面的所有成员变量都使用 初始化列表来做初始化,不要在构造函数里面做赋值
对象组合 composition
内存模型的复杂度
- fully
- by reference
对象里的对象 权限应该设置为private