C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究

C++笔记之两个类的实例之间传递参数------通过构造函数传递类对象的方法详细探究

code review!

文章目录

1.传递对象的const引用------ClassB的实例只能访问ClassA的实例,但不会修改ClassA的实例

代码

cpp 复制代码
class ClassA {
public:
    ClassA(int value) : memberA(value) {}
private:
    int memberA;
};

class ClassB {
public:
    ClassB(const ClassA& aInstance) : memberB(aInstance) {}
private:
    ClassA memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB(objA);
    return 0;
}

2.传递对象的非const引用------ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例

代码

cpp 复制代码
class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB(ClassA& aInstance) : memberB(aInstance) {
        // 在这里可以修改 aInstance 的状态
        aInstance.doSomething();  // 调用 ClassA 的方法
    }
private:
    ClassA& memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB(objA);
    return 0;
}

3.传递对象的指针------ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例

代码

cpp 复制代码
class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB(ClassA* aInstance) : memberB(aInstance) {
        // 在这里可以使用 memberB 指针来操作 aInstance
        memberB->doSomething();  // 调用 ClassA 的方法
    }
private:
    ClassA* memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB(&objA);  // 传递指向 objA 的指针
    return 0;
}

4.传递对象的指针并在堆上初始化该对象

代码

cpp 复制代码
class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB() : memberB(nullptr) {
        // 在构造函数中初始化 memberB 在堆上分配的对象
        memberB = new ClassA(0); // 在这里可以使用适当的参数来初始化 ClassA
    }

    // 析构函数中释放成员变量指向的内存
    ~ClassB() {
        delete memberB;
    }

    void performAction() {
        if (memberB) {
            memberB->doSomething();
        }
    }

private:
    ClassA* memberB;
};

int main() {
    ClassB objB;
    objB.performAction();  // 调用 memberB 对象的方法
    return 0;
}

5.传递对象的指针并在堆上初始化该对象(非通过构造函数传递参数)

代码

cpp 复制代码
class ClassA {
public:
    ClassA(int value) : memberA(value) {}
    void doSomething() {
        // 做一些操作
    }
private:
    int memberA;
};

class ClassB {
public:
    ClassB() : memberB(nullptr) {}

    // 析构函数中释放成员变量指向的内存
    ~ClassB() {
        delete memberB;
    }

    void init(ClassA* aInstance) {
        // 在堆上分配内存并进行初始化
        memberB = new ClassA(*aInstance);
    }

    void performAction() {
        if (memberB) {
            memberB->doSomething();
        }
    }

private:
    ClassA* memberB;
};

int main() {
    ClassA objA(42);
    ClassB objB;
    objB.init(&objA);  // 在堆上分配内存并初始化 memberB
    objB.performAction();  // 调用 memberB 对象的方法
    return 0;
}

6.关于深浅拷贝

相关推荐
HEJOO91 小时前
深入理解 Java volatile 关键字:原理、用法与常见误区
java·开发语言·spring
曹牧1 小时前
Java:no content to map due to end of input
java·开发语言
阿维的博客日记1 小时前
Example 类全场景实战指南
java·mybatis
两点王爷1 小时前
SpringBoot 项目集成 GeoServer 源码,实现地图服务发布
java·spring boot·后端
David猪大卫1 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
Javatutouhouduan2 小时前
Java如何速通性能优化难题?
java·java面试·jvm调优·后端开发·java程序员·java八股文·java性能优化
lemon_sjdk2 小时前
DOM 节点
java·前端·javascript
零衣贰2 小时前
The 2026 ICPC Asia East Continent Online Contest (I) 题解
c++·icpc
leoZ2312 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
驭渊的小故事3 小时前
多线程02
java·开发语言·jvm