在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()
ECSHOP仿QQ官方商城整站源码,基于ECSHOP V2.7.3制作。整体采用黑色。费用漂亮。适合综合,包包,首饰类商城网站使用。 安装方法:1.访问:域名/install,按照程序提示进行安装。2.登陆网站后台,然后进行数据还原。3.模板设置中,选择QQSHOW模板4.清空缓存。。。 注:还原数据后,网站后台信息:后台地址:admin后台用户名:admin后台密码:www.shopex5.co
3
其次,通过容器类的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号