四时宝库

程序员的知识宝库

C++之类的组合与类中类以及this指针

C++类的组合

C++类组合| 是什么

C++类组合是指在一个类中包含另一个类的对象,以实现某种功能或描述某种关系。例如,可以定义一个“汽车”类,其中包含了“发动机”、“轮胎”等成员,来表示一个完整的汽车实体。在这个类中,发动机和轮胎都是作为成员变量来组合到汽车类中的。一般多个事物是另一个事物的一部分的关系(a part of)时候采用组合方式。通过组合,程序员可以更好地描述实体之间的关系,使代码更加具有可读性和可维护性。在实际编程中,组合也是面向对象编程的重要手段之一。

C++类组合| 要点

C++类组合主要有两个要点必须掌握:

  • 构造函数特殊写法:初始化参数列表的方式
  • 构造顺序和析构问题:构造顺序和对象的定义顺序有关

初始化参数列表是用于在C++中初始化类成员变量的一种特殊语法结构。在类的构造函数定义中,使用冒号(:)后跟在构造函数名称后面的初始化参数列表,对类成员变量进行初始化。初始化参数列表的语法结构如下:

class class_name {
public:
    // 构造函数定义
    class_name(arg1_type arg1_value, arg2_type arg2_value, ...) : member1(arg_value1), member2(arg_value2), ... {
        // 函数体
    }
 
private:
    member1_type member1;
    member2_type member2;
    ...
};

在初始化参数列表中,需要按照成员变量在类中的声明顺序,对它们进行初始化。每个成员变量的初始化语法为“成员变量名(参数列表)”,其中参数列表是用于初始化成员变量的值。使用初始化参数列表进行成员变量初始化,可以更加高效地初始化类成员变量。如果不使用初始化参数列表,而是在构造函数体内逐个对成员变量进行赋值,会导致额外的开销,并且可能会因为忘记初始化某个成员变量而导致错误。此外,对于一些特殊类型的成员变量,如常量、引用和对象等,只能使用初始化参数列表进行初始化,无法在构造函数体内进行赋值操作。

C++类组合| 综合代码

创建一个Head类,分别有Eye类,Nose类,Mouse类组成。代码如下:

#include <iostream>
//眼睛
class Eye 
{
public:
  Eye():Eye("明亮眼睛") {}
  Eye(std::string name) 
  {
    eyeName = name;
    std::cout << "构造眼睛" << std::endl;
  }
  void print() 
  {
    std::cout << eyeName << std::endl;
  }
protected:
  std::string eyeName;
};
//鼻子
class Nose 
{
public:
  Nose():Nose("大鼻子") {}
  Nose(std::string name) 
  {
    noseName = name;
    std::cout << "构造鼻子" << std::endl;
  }
  void print()
  {
    std::cout << noseName << std::endl;
  }
protected:
  std::string noseName;
};
//嘴巴
class Mouse 
{
public:
  Mouse():Mouse("樱桃嘴") {}
  Mouse(std::string name) 
  {
    mouseName = name;
    std::cout << "构造嘴巴" << std::endl;
  }
  void print()
  {
    std::cout << mouseName << std::endl;
  }
protected:
  std::string mouseName;
};

//组合类
class Head 
{
public:
  //组合类的构造函数
  //必须要调用分支类的构造函数
  Head() 
  {
    std::cout << "所有的分支类中存在 无参的构造函数调用形态" << std::endl;
  }
  //显式调用有参的构造函数
  //初始化参数列表: 构造函数(参数1,参数2,...):数据成员1(参数1),数据成员2(参数2)...{}
  Head(std::string ename, std::string nname, std::string mname):eye(ename),
    mouse(mname),nose(nname)
  {
    std::cout << "构造head" << std::endl;
  }
  void print() 
  {
    eye.print();
    nose.print();
    mouse.print();
  }

protected:
  //构造顺序是按照整个地方顺序进行的
  Mouse mouse;
  Eye eye;
  Nose nose;
};
int main() 
{
  Head head;
  head.print();
  Head coolman("梁朝伟的眼睛", "成龙的鼻子", "彭于晏的嘴巴");
  coolman.print();
  return 0;
}

程序运行结果如下:

C++类中类

C++类中类|是什么

C++中的类中类,也被称为嵌套类(Nested Class),指的是在一个类中定义的另一个类。类中类可以被看作是一种内部类,它们的作用范围限定在外围类的作用域内。类中类可以被用于实现更加复杂的数据结构和算法,能够方便地封装和组织代码,使代码更加可读、可维护。

C++类中类|要点

C++类中类主要有两个要点必须掌握:

  • 依旧受权限限定
  • 访问: 外面的类名做限定

类中类的使用方式与普通类类似,可以通过OuterClass::InnerClass来访问嵌套类,或者使用using关键字来导入嵌套类的名称。

C++类中类|综合代码

C++类中综合代码主要有以下内容:

  • 直接类中定义的类中类
  • 类中声明类外定义的类中类
  • 使用类中类定义对象

综合测试代码如下:

#include <iostream>
#include <string>

class MM
{
public:
protected:
  //类中声明类外实现
  class Girl;
public:
  //类中类
  class Boy
  {
  public:
    Boy(std::string name) :name(name) {}
    void print()
    {
      std::cout << name << std::endl;
    }
  protected:
    std::string name;
  };
};
class MM::Girl
{
public:
  void print();
protected:
};
void MM::Girl::print() 
{
  std::cout << "必须类名限定" << std::endl;
}
int main()
{
  MM::Boy boy("boy");
  boy.print();
  //类中类依旧受权限限定
  //MM::Girl girl;  //错误
  return 0;
}

C++类中成员与参数同名问题

当C++类中成员与函数参数同名时,主要有以下三种解决方案:

  • 初始化参数列表:仅限构造函数
  • this指针标识:this指针是一个特殊指针,它指向当前对象本身
  • 类名限定

综合测试代码如下:

#include <iostream>
#include <string>
class MM
{
public:
  //2.初始化参数列表
  MM(std::string name, int age) :name(name), age(age)
  {
    //1.类名限定
    //MM::name = name;
    //MM::age = age;
  }
  //3.this指针
  //  girl.setData("小丽", 28);
  //  this=&girl
  void setData(std::string name, int age)
  {
    //3.this指针标识
    this->name = name;
    this->age = age;
  }
  MM& getObject()
  {
    return *this;
  }

  void print()
  {
    std::cout << name << "\t" << age << std::endl;
  }
protected:
  std::string name;
  int age;
};


int main()
{
  MM girl("小芳", 18);
  girl.print();
  girl.setData("小丽", 28);
  girl.print();
  girl.getObject().getObject().print();
  return 0;
}

相关

如果阁下正好在学习C/C++,看文章比较无聊,不妨关注下关注下小编的视频教程,通俗易懂,深入浅出,一个视频只讲一个知识点。视频不深奥,不需要钻研,在公交、在地铁、在厕所都可以观看,随时随地涨姿势。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接