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.关于深浅拷贝

相关推荐
BerryS3N4 小时前
Java 后端转型大模型:Demo 能跑不等于能上线
java·人工智能·python·java后端·spring ai·langchain4j·大模型转型
心机之蛙qee4 小时前
Docker Compose 多容器编排
java·docker·容器
秋田君4 小时前
QT_QColorDialog颜色对话框
java·数据库·qt
罗西的思考4 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 — (14)— Teacher
人工智能·笔记·深度学习·算法·机器学习
醉城夜风~5 小时前
手撕 C++ string:从零实现一个简易字符串类
开发语言·c++·算法
nLif5 小时前
进程管道通讯-伪终端方式
c++·windows
用户91366296220125 小时前
ViewModelScope 简介与使用
java
上海安当技术5 小时前
老系统零改造接入:旁路代理统一认证实战
java·servlet·架构·kubernetes·jenkins
颜x小5 小时前
[C#]泛型类与泛型方法
开发语言·c++·c#
青山木5 小时前
Hot 100 --- 组合总和
java·数据结构·算法·leetcode