内嵌对象,即一个类内的对象中有另一个类的对象。如下
#includeusing namespace std; //A类 class A{ public: A(){cout <<"moren" << endl;} A(int a){cout << "youcan" << endl; x = a;} private: int x; }; //B类 class B{ public: B(){} private: A a; };
在B中,内嵌对象A a必须在类B之前初始化。
也就是在调用B的构造函数之前A已经调用过构造函数。
这个时候A会默认调用默认构造。输出moren。
问题是:怎么调用A的有参构造而不是调用默认构造呢?
注意!不能简单地在B类中A a(1); 这么初始化。
类内非静态成员不能不通过对象初始化。
class A{
public:
A() = delete;
//A(){cout <<"moren" << endl;}
A(int a){cout << "youcan" << endl; x = a;}
private:
int x;
};
C++中有两个语句可以命令编译器生成或者不生成默认构造函数
A() = default;//生成默认构造函数 A() = delete;//不生成默认构造函数
这样可以在B构造函数中运用初始化列表,对a进行赋值。
class B{
public:
B(int m):a(m){
}
private:
A a;
};
需要区分的是!
#includeusing namespace std; class A{ public: A() = delete; //A(){cout <<"moren" << endl;} A(int a){cout << "youcan" << endl; x = a;} private: int x; }; class B{ public: B(int m):a(m){ this->b(m); } private: A a; A b(int); }; A B::b(int){ cout << "amazing" << endl; A a(1); return a; } int main() { int m = 1; B b(m); return 0; }
A b(int);此时 b 是个函数,也就是B中的成员有一个返回值为A类型的函数!注意区分!



