首页 > 编程语言 >c++类的组合

c++类的组合

时间:2024-06-22 16:00:29浏览次数:8  
标签:value Outer 组合 c++ Inner constructor public 构造函数

类的组合描述的是一个类内嵌其他类的对象作为成员的情况,它们之间的关系是一种包含与被包含的关系

class Engine {  
public:  
    void start() {  
        // 启动引擎的逻辑  
        std::cout << "Engine started!" << std::endl;  
    }  
  
    // ... 其他引擎相关的方法 ...  
};  
  
class Car {  
private:  
    Engine engine; // Car类包含一个Engine类的对象作为成员  
  
public:  
    void startCar() {  
        engine.start(); // 调用Engine对象的start方法  
        // ... 其他启动汽车的逻辑 ...  
    }  
  
    // ... 其他汽车相关的方法 ...  
};  
  
int main() {  
    Car myCar;  
    myCar.startCar(); // 输出:Engine started! ...(其他启动汽车的逻辑)  
    return 0;  
}

注意:

若创建类的对象时,此类中具有内嵌对象成员,那么各个内嵌对象将被自动创建

在创建对象是要对内嵌对象成员进行初始化

class Inner {  
public:  
    int value;  
    Inner(int v) : value(v) {} // Inner类的构造函数  
};  
 
class Outer {  
public:  
    Inner innerObj;  
    Outer(int v) : innerObj(v) {} // 使用初始化列表初始化innerObj  
};  
 
int main() {  
    Outer outer(10); // 创建一个Outer对象,并使用10来初始化其innerObj成员  
    // 此时outer的innerObj的value成员已经被初始化为10  
}

聚合初始化(C++11及以后版本)
对于聚合类型(没有用户定义的构造函数、没有私有或保护的非静态数据成员、没有基类也没有虚函数的类),可以使用聚合初始化来初始化成员。

#include<iostream>  
using namespace std;  
  
class Inner {  
public:  
   int value;
   
};  
 
class Outer {  
public:  
    Inner innerObj; 
	void coutt()
   {
   	cout<<innerObj.value; 
	 }   
};  
int main() {  
    Outer outer = {Inner{10}}; // 使用聚合初始化来初始化outer的innerObj成员  
    // 此时outer的innerObj的value成员已经被初始化为10 
	outer.coutt();
}

组合类构造函数的定义一般形式:

类名::类名(形参表):内嵌对象1(形参表),内嵌对象2(形参表){

类的初始化

}

对基本数据成员也可以定义为

A::A(int a):r(a){}       r基本数据成员

调用内嵌构造函数顺序:按内嵌对象定义的顺序调用

注意:在构造函数中出现的顺序和调用顺序无关

#include <iostream>  
  
class Inner1 {  
public:  
    Inner1() { std::cout << "Inner1 constructor\n"; }  
};  
  
class Inner2 {  
public:  
    Inner2() { std::cout << "Inner2 constructor\n"; }  
};  
  
class Outer {  
public:  
    Inner1 inner1;  
    Inner2 inner2;  
  
    Outer() : inner2(), inner1() { // 初始化列表中的顺序与构造函数的调用顺序无关  
        // 注意:即使这里inner2在inner1之前,但inner1的构造函数仍然会先被调用  
    }  
};  
  
int main() {  
    Outer outer; // 构造Outer对象  
    return 0;  
}

输出结果

Inner1 constructor

Inner2 constructor

若有些对象为出现在构造函数中,也会被调用:

#include <iostream>  
  
class Inner1 {  
public:  
    Inner1() { std::cout << "Inner1 constructor\n"; }  
};  
  
class Inner2 {  
public:  
    Inner2() { std::cout << "Inner2 constructor\n"; }  
};  
  
class Outer {  
public:  
    Inner1 inner1;  
    Inner2 inner2;  
  
    Outer() {  
        // 注意:没有在初始化列表中明确列出inner1和inner2  
        // 但它们的构造函数仍然会按照声明顺序被调用  
    }  
};  
  
int main() {  
    Outer outer; // 构造Outer对象  
    return 0;  
}

输出结果

Inner1 constructor

Inner2 constructor


 

#include <iostream>  
  
class Inner {  
public:  
    Inner() { std::cout << "Inner constructor\n"; }  
    ~Inner() { std::cout << "Inner destructor\n"; }  
};  
  
class Outer : public Base { // 假设有一个基类Base  
public:  
    Inner inner1;  
    Inner inner2;  
  
    Outer() {  
        std::cout << "Outer constructor\n";  
    }  
  
    ~Outer() {  
        std::cout << "Outer destructor\n";  
    }  
};  
  
class Base {  
public:  
    Base() { std::cout << "Base constructor\n"; }  
    ~Base() { std::cout << "Base destructor\n"; }  
};  
  
int main() {  
    Outer outer;  
    return 0;  
}

Base constructor // 基类构造函数

Inner constructor // 成员inner1的构造函数

Inner constructor // 成员inner2的构造函数

Outer constructor // 当前类Outer的构造函数

Outer destructor // 当前类Outer的析构函数

Inner destructor // 成员inner2的析构函数(逆序)

Inner destructor // 成员inner1的析构函数(逆序)

Base destructor // 基类析构函数

组合类的复制构造函数

 Outer(const Outer& other) : inner1(other.inner1), inner2(other.inner2){}

#include <iostream>  
  
class Inner {  
public:  
    int value;  
      
    Inner(int v = 0) : value(v) {  
        std::cout << "Inner constructor with value " << value << std::endl;  
    }  
      
    Inner(const Inner& other) : value(other.value) {  
        std::cout << "Inner copy constructor with value " << value << std::endl;  
    }  
      
    // ... 其他成员函数 ...  
};  
  
class Outer {  
public:  
    Inner inner1;  
    Inner inner2;  
      
    Outer(int v1 = 0, int v2 = 0) : inner1(v1), inner2(v2) {  
        std::cout << "Outer constructor" << std::endl;  
    }  
      
    // 复制构造函数  
    Outer(const Outer& other) : inner1(other.inner1), inner2(other.inner2) {  
        std::cout << "Outer copy constructor" << std::endl;  
    }  
      
    // ... 其他成员函数 ...  
};  
  
int main() {  
    Outer original(1, 2); // 调用Outer和Inner的构造函数  
    Outer copy = original; // 调用Outer的复制构造函数,它会调用Inner的复制构造函数  
    return 0;  
}

Inner constructor with value 1  
Inner constructor with value 2  
Outer constructor  
Outer copy constructor  
Inner copy constructor with value 1  
Inner copy constructor with value 2

标签:value,Outer,组合,c++,Inner,constructor,public,构造函数
From: https://blog.csdn.net/2301_82343802/article/details/139863026

相关文章

  • js组合继承
    JS组合继承(combinationinheritance)是一种常用的继承模式,它通过将原型链和构造函数组合使用来实现继承。下面是JS组合继承的详细解析和代码示例:创建父类(基类)的构造函数functionParent(name){this.name=name;this.colors=['red','green','blue'];}给父类添......
  • C++用扩充的结构体类型求复数的绝对值
    结构体的扩充,声明一个扩充的结构体complex,complex结构体中两个双精度数据real和imag,分别代表实数部分和虚数部分 另外还有两个属于结构体的函数:init,asbcomplex,其中init用来给real和imag赋初值,asbcomplex用来计算和返回复数的绝对值real和imag是数据成员函数init和asbcom......
  • 理解C++虚函数和虚表(vtbl)机制
    引言C++是一种强大且灵活的编程语言,它支持面向对象编程(OOP)的各种特性,其中虚函数(virtualfunction)是实现多态性(polymorphism)的关键机制。本文将深入探讨虚函数的原理、虚表(vtbl)的作用,以及这些特性在实际编程中的实现。通过理解这些概念,您将能够更好地掌握C++的多态性和面向......
  • Effective C++ 改善程序与设计的55个具体做法笔记与心得 4
    四.设计与声明18.让接口容易被正确使用,不易被误用请记住:好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质“促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。“阻止误用”的办法包括建立新类型、限制类型上的操作、束缚......
  • 1.3 多项式乘法及其组合意义
    记号1设\(f(x)\)是关于变元\(x\)的多项式,则对正整数\(n\),记\(\left[x^n\right]f:=f(x)\)的\(x^n\)项系数.例如,若$f(x)=-3+5x+7x^3$,则$\left[x^0\right]f=-3,\left[x^1\right]f=5,\left[x^2\right]f=0$,$\left[x^3\right]f=7$.一般地,由微积分中......
  • C/C++ 堆栈stack算法详解及源码
    堆栈(stack)是一种常见的数据结构,具有"先进后出"(LastInFirstOut,LIFO)的特性。堆栈算法允许在堆栈顶部进行元素的插入和删除操作。堆栈的操作包括:入栈(Push):将元素添加到堆栈的顶部。出栈(Pop):从堆栈的顶部移除元素。取栈顶元素(Top):获取堆栈顶部的元素,但不对其进行删除操作。......
  • C/C++ stack实现深度优先搜索DFS算法详解及源码
    深度优先搜索(DepthFirstSearch,DFS)是一种图遍历算法,它从一个节点开始,通过访问其相邻节点的方式,依次深入到图中的更深层次。Stack(栈)是一种先进后出(LastInFirstOut,LIFO)的数据结构,它非常适合实现DFS算法。首先,我们来解释一下Stack实现DFS算法的原理。DFS算法的核心思想是......
  • 【C++ | 重载运算符】一文弄懂C++运算符重载,怎样声明、定义运算符,重载为友元函数
    ......
  • 190.回溯算法:组合(力扣)
    代码随想录(programmercarl.com)一、什么是回溯算法    回溯算法是一种通用的算法设计技巧,特别适用于解决组合、排列、子集等问题。它通过逐步构建解决方案,并在发现部分解决方案无效时撤销(回溯)部分计算,从而寻找所有可能的解决方案。    回溯算法的基本思......
  • C++PrimerPlus:第十三章类和继承:抽象基类
    :第十三章类和继承:抽象基类提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如::第十三章类和继承:抽象基类提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录:第十三章类和继承:抽象基类前言一、抽象基类总结前言提示:这......