类对象作为类成员

当其他类对象作为本类成员,构造时先构造类对象,再构造自身

#include<iostream>
#include<cstring>
using namespace std;
class Phone
{
public:
	Phone(string pName)
	{
		m_PName = pName;
		cout << "调用phone构造函数" << endl;
	}
	string m_PName;
};
class Person
{
public:
	Person(string name, string pName) :m_Name(name), m_Phone(pName) { cout << "调用person构造函数" << endl; }
	string m_Name;
	Phone m_Phone;
};
void test01()
{
	Person p("zhagnsan", "iphone 13 promax");
	cout << p.m_Name << "use:" << p.m_Phone.m_PName << endl; //person调用成员m_Phone,m_Perosn再调用成员m_PName
}
int main()
{
	test01();
}

### C++ 类对象作为类成员的直接初始化 在C++中,当一个的对象被用作另一个成员时,可以直接对其进行初始化。这种情况下,可以在构造函数的初始化列表中完成这一操作。 #### 使用初始化列表进行成员对象初始化 对于`MyClass`拥有其他的对象作为其成员的情况,推荐的做法是在构造函数的初始化列表中对该成员对象进行显式的初始化: ```cpp class A { public: A(int val) : value(val) {} private: int value; }; class B { public: B() : a_object(42), b_value(99) {} // 初始化列表用于初始化a_object和b_value private: A a_object; // 对象A作为成员变量 int b_value; // 普通整型成员变量 }; ``` 上述代码展示了如何通过构造函数的初始化列表来设置成员对象`a_object`的初始状态[^1]。 #### 成员对象默认构造方式 如果希望依赖于成员对象自身的默认构造函数,则无需特别指定,在定义成员位置处即可采用花括号语法来进行简单的值初始化或聚合初始化(适用于支持此特性的型),如下所示: ```cpp class Container { public: Container(); // 默认构造函数可能不需要参数 private: std::vector<int> elements{1, 2, 3}; // 聚合初始化向量 std::map<int, std::string> mappings{{1,"one"}, {2,"two"}}; // 复杂型的嵌套初始化 }; ``` 这里展示的是利用现代C++特性简化了某些场景下的初始化过程。 #### 静态成员对象处理 需要注意的是,静态数据成员不属于任何一个具体的实例而是整个所共有;因此它们应当单独在外部分配空间并初始化。这同样适用于静态成员对象的情形: ```cpp class Singleton { public: static const Singleton& instance(); private: static Singleton* s_instance; Singleton(); }; // 文件作用域外部链接声明 Singleton* Singleton::s_instance = nullptr; ``` 此处说明了静态成员对象应遵循特定规则以确保程序逻辑正确性[^3]。 #### 关联问题考虑 考虑到拷贝语义的影响,当涉及到含有复杂资源管理功能的成员对象时,应该仔细设计拷贝构造函数的行为,防止潜在的风险如浅复制带来的双释放错误等问题[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值