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

相关推荐
Abladol-aj几秒前
并发和并行的基础知识
java·linux·windows
清水白石0081 分钟前
从一个“支付状态不一致“的bug,看大型分布式系统的“隐藏杀机“
java·数据库·bug
xiaoyalian5 小时前
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
笔记·r语言·数据可视化
南东山人5 小时前
一文说清:C和C++混合编程
c语言·c++
吾日三省吾码5 小时前
JVM 性能调优
java
弗拉唐6 小时前
springBoot,mp,ssm整合案例
java·spring boot·mybatis
Red Red6 小时前
网安基础知识|IDS入侵检测系统|IPS入侵防御系统|堡垒机|VPN|EDR|CC防御|云安全-VDC/VPC|安全服务
网络·笔记·学习·安全·web安全
oi777 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
贰十六7 小时前
笔记:Centos Nginx Jdk Mysql OpenOffce KkFile Minio安装部署
笔记·nginx·centos