C++核心语法:explicit与友元全解析
一、上期回顾搞定菱形继承、虚继承解决多继承二义性与数据冗余继承板块彻底学完。今天集中补齐C 剩余高频语法细节explicit 关键字、友元函数 / 友元类、命名空间深度、成员初始化细节收尾 C 基础语法全部重难点。二、explicit 关键字作用禁止单参构造函数隐式类型转换无 explicit 隐式转换坑点class Person { public: Person(int age) { cout 有参构造 endl; } }; int main() { // 隐式转换int 自动转 Person 对象 Person p 18; return 0; }编译器偷偷把18隐式构造出临时对象容易引发诡异 bug。加 explicit 禁止隐式转换class Person { public: explicit Person(int age) { cout 有参构造 endl; } }; int main() { // 报错禁止隐式转换 // Person p 18; // 只能显式调用 Person p(18); return 0; }工程规范单参构造一律加explicit杜绝隐式转换。三、友元函数作用让全局函数可以直接访问类的private私有成员语法类内声明friend类外实现普通函数#include iostream using namespace std; class Point { private: int x, y; // 声明友元 friend void printPoint(const Point p); public: Point(int a, int b) : x(a), y(b) {} }; // 全局友元函数 void printPoint(const Point p) { // 直接访问私有成员 cout p.x p.y endl; } int main() { Point p(10,20); printPoint(p); return 0; }四、友元类一个类可以成为另一个类的友元全部成员函数都能访问对方私有成员行class A { // 声明B是A的友元类 friend class B; private: int num 100; }; class B { public: void show(A a) { // 直接访问A私有成员 cout a.num endl; } };友元缺点破坏封装性尽量少用仅运算符重载、少量特殊场景使用。五、命名空间 namespace 深度解决问题大型项目全局命名冲突隔离代码域1. 定义命名空间namespace MyCode { int val 666; void func() { cout 命名空间函数 endl; } }2. 三种使用方式// 方式1作用域访问 MyCode::val; // 方式2引入单个成员 using MyCode::func; // 方式3引入整个命名空间 using namespace MyCode;3. 命名空间嵌套namespace A { namespace B { int x 10; } } // 使用A::B::x六、类内成员初始化陷阱1. 初始化列表优先于构造函数赋值2. 初始化顺序只看类内声明顺序和初始化列表顺序无关class Test { private: int a; int b; public: // 先初始化a再b不是按列表顺序 Test(int x) : b(x), a(b) { } };极易出现未定义行为开发尽量按声明顺序写初始化列表。七、今日核心总结explicit禁止单参构造隐式转换工程必加友元函数全局函数访问类私有成员友元类整个类拥有访问权限破坏封装慎用namespace解决命名冲突支持嵌套、三种引入方式成员初始化顺序由类内声明顺序决定与初始化列表无关八、课后练习给单参构造加 explicit测试隐式转换是否报错手写友元函数直接访问类私有成员自定义命名空间隔离自己的函数和变量
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2611701.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!