C++ 内嵌对象的默认构造与有参构造

内嵌对象,即一个类内的对象中有另一个类的对象。如下

#include 

using 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;
};

需要区分的是!

#include 

using 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类型的函数!注意区分!

你可能感兴趣的:(c++,visual,studio)