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 指针来操作 aInstance
memberB->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); // 在堆上分配内存并初始化 memberB
objB.performAction(); // 调用 memberB 对象的方法
return 0;
}