在C++组合类型中,访问修饰符控制类成员的可见性,private成员仅类内可访问,public成员可被外部访问,protected成员供派生类使用;组合关系下,外层类只能通过内层对象的public接口与其交互,即使内层成员为protected,外层类也无法访问,因protected仅在继承体系中生效,组合不构成继承关系,故外层类与被组合对象间仍需遵循封装原则,通过public方法间接操作,确保安全性与低耦合。

在C++的组合类型中,访问修饰符(
public
private
protected
C++的访问修饰符,
public
private
protected
首先,我们得明确这三个修饰符的基本含义:
public
private
protected
在组合关系中,一个类(我们称之为“容器类”或“外层类”)包含另一个类的对象(我们称之为“被组合对象”或“内层对象”)作为其成员。此时,访问修饰符的作用体现在两个层面:
立即学习“C++免费学习笔记(深入)”;
举个例子,假设我们有一个
Engine
Car
Car
Engine
// Engine.h
class Engine {
private:
int horsepower;
void igniteSparkPlugs() { /* ... */ }
public:
Engine(int hp) : horsepower(hp) {}
void start() {
igniteSparkPlugs(); // Engine内部可以访问private成员
// ...
}
int getHorsepower() const { return horsepower; }
};
// Car.h
class Car {
private:
Engine engine; // Engine对象作为Car的private成员
// ...
public:
Car(int engineHP) : engine(engineHP) {}
void drive() {
// Car类可以访问其private成员engine
engine.start(); // Car可以调用Engine的public方法
// engine.igniteSparkPlugs(); // 错误:Car无法访问Engine的private方法
// ...
}
int getEnginePower() const {
return engine.getHorsepower(); // Car可以调用Engine的public方法
}
};
// main.cpp
int main() {
Car myCar(200);
myCar.drive();
// myCar.engine.start(); // 错误:main函数无法直接访问Car的private成员engine
// myCar.engine.getHorsepower(); // 错误:同上
return 0;
}从这个例子可以看出:
Engine
private
horsepower
igniteSparkPlugs
Engine
Engine
public
start
getHorsepower
Engine
Car
Engine
private
Car
Engine
main
myCar.engine
Car
drive
getEnginePower
Engine
Engine
public
Car
Engine
Engine
Engine
private
说白了,访问修饰符是作用在“点”运算符(
.
myCar.engine
Engine
Car
Car
engine.start()
start
Engine
Engine
在C++的组合设计中,巧妙运用访问修饰符是构建高内聚、低耦合系统的关键。我个人认为,其核心在于“默认私有,按需开放”的原则,以及对“接口与实现分离”的深刻理解。
首先,将组合成员设为private
Car
Engine
Car
Engine
Engine
Car
Car
Engine
Car
Car
Car
Car
Car
Engine
public
myCar.engine.igniteSparkPlugs()
其次,通过容器类的public
public
public
Car
drive()
engine.start()
Car
再者,警惕friend
friend
private
protected
friend
public
friend
friend
最后,利用const
const
const
const
protected
这是一个非常好的问题,因为
protected
在继承关系中,protected
protected
protected
private
protected
class Base {
protected:
int baseData;
void baseMethod() { /* ... */ }
public:
Base() : baseData(10) {}
};
class Derived : public Base {
public:
void accessBase() {
baseData = 20; // OK: Derived可以访问Base的protected成员
baseMethod(); // OK: Derived可以访问Base的protected方法
}
};
// main.cpp
int main() {
Derived d;
// d.baseData = 30; // 错误:main函数不能访问protected成员
return 0;
}然而,在组合关系中,protected
A
B
A
B
B
protected
A
A
B
protected
private
B
A
B
public
B
我们回到
Car
Engine
Engine
protected
class Engine {
protected:
int engineID; // 假设这是Engine的protected成员
void internalCheck() { /* ... */ }
private:
int horsepower;
public:
Engine(int hp) : horsepower(hp), engineID(100) {}
void start() { internalCheck(); }
int getHorsepower() const { return horsepower; }
};
class Car {
private:
Engine engine;
public:
Car(int engineHP) : engine(engineHP) {}
void inspectEngine() {
// engine.engineID = 200; // 错误:Car无法访问Engine的protected成员
// engine.internalCheck(); // 错误:Car无法访问Engine的protected方法
engine.start(); // OK: 通过public接口间接调用internalCheck
}
};从代码中可以清晰地看到,
Car
Engine
protected
engineID
internalCheck()
Car
Engine
protected
因此,在组合设计中,如果被组合对象的某个成员被声明为
protected
protected
private
以上就是C++组合类型中访问修饰符使用方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号