栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/846985.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号