21xrx.com
2024-12-22 22:20:45 Sunday
登录
文章检索 我的文章 写文章
C++内嵌对象初始化技巧详解
2023-07-04 18:28:41 深夜i     --     --
C++ 内嵌对象 初始化技巧 详解

C++语言中,对象的初始化是一个非常重要的环节。而内嵌对象的初始化更是需要特别细心的处理。本文将详细讲解C++内嵌对象初始化技巧。

一、概述

内嵌对象是指一个对象作为另一个对象的成员。在C++中,内嵌对象构造函数的调用是在包含该对象的构造函数内部执行的。因此,内嵌对象的初始化顺序和成员变量的声明顺序有关。由此可见,内嵌对象初始化的顺序比较复杂,需要特别注意的是它可能与程序员的初衷不符。

二、构造函数调用顺序

当一个类包含多个内嵌对象时,它们的构造函数调用的顺序取决于它们在成员列表中的声明顺序。例如:


class A

{

public:

  A() cout << "A" << endl;

};

class B

{

public:

  B() cout << "B" << endl;

};

class C

{

public:

  C() cout << "C" << endl;

};

class D

{

public:

  D() cout << "D" << endl;

};

class E

{

public:

  E() cout << "E" << endl;

};

class F

{

public:

  A m_A;

  B m_B;

  C m_C;

  D m_D;

  E m_E;

  F() cout << "F" << endl;

};

int main()

  F f;

  return 0;

输出结果为:


A

B

C

D

E

F

可以看出,内嵌对象的构造函数调用顺序与成员变量的声明顺序相同。

三、内嵌对象初始化

在内嵌对象初始化过程中,需要注意以下几个方面:

1. 内嵌对象构造函数调用

内嵌对象的构造函数调用是在包含该对象的构造函数内执行的。因此,在包含内嵌对象的类的构造函数中,应该显式地调用内嵌对象的构造函数。例如:


class Name

{

public:

  Name(const string& str) : m_str(str) { }

private:

  string m_str;

};

class Person

{

public:

  Person(const string& name) : m_name(name) { }

private:

  Name m_name;

};

int main()

{

  Person p("Tom");

  return 0;

}

2. 内嵌对象拷贝构造函数调用

当包含内嵌对象的类进行拷贝构造时,必须调用内嵌对象的拷贝构造函数。例如:


class Name

{

public:

  Name(const string& str) : m_str(str) { }

  Name(const Name& other) : m_str(other.m_str) { }

private:

  string m_str;

};

class Person

{

public:

  Person(const string& name) : m_name(name) { }

  Person(const Person& other) : m_name(other.m_name) { }

private:

  Name m_name;

};

int main()

{

  Person p1("Tom");

  Person p2 = p1;

  return 0;

}

3. 内嵌对象赋值运算符调用

当包含内嵌对象的类进行赋值运算符时,必须调用内嵌对象的赋值运算符。例如:


class Name

{

public:

  Name(const string& str) : m_str(str) { }

  Name& operator=(const Name& other)

  {

    if (this != &other)

    

      m_str = other.m_str;

    

    return *this;

  }

private:

  string m_str;

};

class Person

{

public:

  Person(const string& name) : m_name(name) { }

  Person& operator=(const Person& other)

  {

    if (this != &other)

    

      m_name = other.m_name;

    

    return *this;

  }

private:

  Name m_name;

};

int main()

{

  Person p1("Tom");

  Person p2("Jack");

  p1 = p2;

  return 0;

}

四、小结

内嵌对象初始化在C++中需要特别小心,需要根据成员变量的声明顺序和构造函数调用顺序来理解。在实际项目中,开发者需要结合实际情况来灵活处理内嵌对象的初始化问题。只有掌握了内嵌对象初始化技巧,才能编写出更加安全、高效的代码。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复