C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究
code review!
文章目录
- C++笔记之两个类的实例之间传递参数——通过构造函数传递类对象的方法详细探究
- 1.传递对象的const引用——ClassB的实例只能访问ClassA的实例,但不会修改ClassA的实例
- 2.传递对象的非const引用——ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例
- 3.传递对象的指针——ClassB的实例既可以访问ClassA的实例,也可以修改ClassA的实例
- 4.传递对象的指针并在堆上初始化该对象
- 5.传递对象的指针并在堆上初始化该对象(非通过构造函数传递参数)
- 6.关于深浅拷贝
1.传递对象的const引用——ClassB的实例只能访问ClassA的实例,但不会修改ClassA的实例
代码
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的实例
代码
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的实例
代码
class ClassA {
public:ClassA(int value) : memberA(value) {}void doSomething() {// 做一些操作}
private:int memberA;
};class ClassB {
public:ClassB(ClassA* aInstance) : memberB(aInstance) {// 在这里可以使用 memberB 指针来操作 aInstancememberB->doSomething(); // 调用 ClassA 的方法}
private:ClassA* memberB;
};int main() {ClassA objA(42);ClassB objB(&objA); // 传递指向 objA 的指针return 0;
}
4.传递对象的指针并在堆上初始化该对象
代码
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.传递对象的指针并在堆上初始化该对象(非通过构造函数传递参数)
代码
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); // 在堆上分配内存并初始化 memberBobjB.performAction(); // 调用 memberB 对象的方法return 0;
}