一、完整构造函数体系构造函数负责对象初始化除了基础的无参、有参构造还有拷贝构造、初始化列表、委托构造等常用形式也是类的核心基础。1. 初始化列表推荐优先使用在构造函数函数体执行之前完成成员初始化效率更高也是初始化const成员、引用成员的唯一方式。cpp运行#include iostream #include string using namespace std; class Student { public: string name; int age; const int id; // 常量成员只能用初始化列表初始化 // 初始化列表写法 Student(string n, int a, int i) : name(n), age(a), id(i) { cout 有参构造执行 endl; } }; int main() { Student s(小明, 18, 1001); cout s.name s.age s.id endl; return 0; }2. 拷贝构造函数使用已有对象去初始化新对象函数参数必须为本类常引用。 触发场景对象赋值初始化、函数传值调用、函数返回对象。cpp运行class Student { public: string name; int age; Student(string n, int a) : name(n), age(a) {} // 拷贝构造函数 Student(const Student s) { name s.name; age s.age; cout 拷贝构造执行 endl; } }; int main() { Student s1(小红, 17); Student s2 s1; // 触发拷贝构造 return 0; }3. 委托构造函数一个构造函数调用本类中其他构造函数简化重复代码。cpp运行class Student { public: string name; int age; // 基础构造 Student(string n, int a) : name(n), age(a) {} // 委托构造调用上方构造 Student(string n) : Student(n, 0) { cout 委托构造执行 endl; } };补充如果类中没有手动编写任何构造函数编译器会自动生成默认无参构造一旦自定义构造编译器不再提供默认构造。二、类的类型转换分为隐式类型转换和自定义类型转换函数实现对象与基本数据类型之间的相互转换。1. 单参构造函数隐式转换只有一个参数的构造函数会自动将参数类型转为当前类对象。cpp运行class Person { public: int num; // 单参构造int 隐式转为 Person 对象 Person(int n) : num(n) {} }; int main() { Person p 20; // 等价于 Person p(20); 隐式转换生效 return 0; }使用explicit关键字可以禁止隐式转换只允许显式调用构造cpp运行explicit Person(int n) : num(n) {} // Person p 20; // 报错隐式转换被禁止 Person p(20); // 合法显式调用2. 类型转换运算符对象转基础类型格式operator 目标类型(){}实现对象反向转为普通数据类型。cpp运行class Person { public: int age; Person(int a) : age(a) {} // 类型转换函数对象转 int operator int() { return age; } }; int main() { Person p(18); int a p; // 自动调用转换函数对象转int cout a endl; return 0; }三、static 静态成员静态成员不属于某个单独对象而是属于整个类所有对象共享同一份数据分为静态成员变量和静态成员函数。1. 静态成员变量类内声明类外必须初始化所有对象共用修改一处全部生效cpp运行class Person { public: static int count; // 类内声明 int id; }; int Person::count 0; // 类外初始化 int main() { Person p1; Person p2; p1.count; cout p2.count endl; // 输出 1数据共享 return 0; }2. 静态成员函数可通过类名::直接调用无需创建对象只能访问静态成员不能访问普通成员cpp运行class Person { public: static int count; static void showCount() { cout 总数量 count endl; } }; int Person::count 0; int main() { Person::showCount(); // 类名直接调用 return 0; }四、友元 friend类的私有成员默认外部无法访问友元相当于给外部开了访问权限分为友元函数和友元类。注意友元破坏了封装性日常开发谨慎使用。1. 友元函数让普通函数、全局函数访问类的私有成员cpp运行class Person { private: int num 10; friend void print(Person p); // 声明友元函数 }; // 全局友元函数 void print(Person p) { cout p.num endl; // 正常访问私有成员 } int main() { Person p; print(p); return 0; }2. 友元类将整个类声明为友元友元类中所有成员函数都可以访问当前类的私有内容cpp运行class A { private: int data 99; friend class B; // 声明 B 为友元类 }; class B { public: void test(A a) { cout a.data endl; // 访问A的私有成员 } };五、内部类在一个类的内部定义另一个类嵌套的类称为内部类。内部类作用域隶属于外部类内部类天然是外部类的友元可以直接访问外部类私有成员使用时需要加作用域解析符外部类::内部类cpp运行class Outer // 外部类 { private: int val 100; public: // 内部类 class Inner { public: void func(Outer o) { cout o.val endl; // 访问外部类私有成员 } }; }; int main() { Outer::Inner in; // 定义内部类对象 Outer out; in.func(out); return 0; }六、匿名对象没有变量名的临时对象创建后立即使用本行代码执行完毕就自动销毁常用来简化代码传参、赋值。基本用法cpp运行class Person { public: Person(int a) { cout 构造执行 endl; } ~Person() { cout 析构执行 endl; } }; int main() { Person(20); // 匿名对象本行结束立即销毁 return 0; }常用场景直接给有名对象赋值cpp运行Person p Person(18);作为函数实参cpp运行void test(Person p){} test(Person(15)); // 匿名对象传参七、综合示例知识点整合将以上所有特性整合在一份代码中完整串联练习cpp运行#include iostream using namespace std; class Outer { private: static int s_num; int m_num 20; friend void friendFunc(Outer o); // 友元函数 public: // 构造 初始化列表 Outer(int n) : m_num(n) {} // 静态成员函数 static void showStatic() { cout 静态值 s_num endl; } // 内部类 class Inner { public: void work(Outer o) { cout 内部类访问 o.m_num endl; } }; // 类型转换函数 operator int() { return m_num; } }; int Outer::s_num 66; // 友元函数实现 void friendFunc(Outer o) { cout 友元访问 o.m_num endl; } int main() { Outer::showStatic(); Outer o1(30); Outer::Inner in; in.work(o1); friendFunc(o1); // 类型转换 int res o1; cout 对象转数值 res endl; // 匿名对象 Outer(50); return 0; }
C++的构造函数、类型转换、static、友元、内部类与匿名对象
发布时间:2026/6/10 6:50:21
一、完整构造函数体系构造函数负责对象初始化除了基础的无参、有参构造还有拷贝构造、初始化列表、委托构造等常用形式也是类的核心基础。1. 初始化列表推荐优先使用在构造函数函数体执行之前完成成员初始化效率更高也是初始化const成员、引用成员的唯一方式。cpp运行#include iostream #include string using namespace std; class Student { public: string name; int age; const int id; // 常量成员只能用初始化列表初始化 // 初始化列表写法 Student(string n, int a, int i) : name(n), age(a), id(i) { cout 有参构造执行 endl; } }; int main() { Student s(小明, 18, 1001); cout s.name s.age s.id endl; return 0; }2. 拷贝构造函数使用已有对象去初始化新对象函数参数必须为本类常引用。 触发场景对象赋值初始化、函数传值调用、函数返回对象。cpp运行class Student { public: string name; int age; Student(string n, int a) : name(n), age(a) {} // 拷贝构造函数 Student(const Student s) { name s.name; age s.age; cout 拷贝构造执行 endl; } }; int main() { Student s1(小红, 17); Student s2 s1; // 触发拷贝构造 return 0; }3. 委托构造函数一个构造函数调用本类中其他构造函数简化重复代码。cpp运行class Student { public: string name; int age; // 基础构造 Student(string n, int a) : name(n), age(a) {} // 委托构造调用上方构造 Student(string n) : Student(n, 0) { cout 委托构造执行 endl; } };补充如果类中没有手动编写任何构造函数编译器会自动生成默认无参构造一旦自定义构造编译器不再提供默认构造。二、类的类型转换分为隐式类型转换和自定义类型转换函数实现对象与基本数据类型之间的相互转换。1. 单参构造函数隐式转换只有一个参数的构造函数会自动将参数类型转为当前类对象。cpp运行class Person { public: int num; // 单参构造int 隐式转为 Person 对象 Person(int n) : num(n) {} }; int main() { Person p 20; // 等价于 Person p(20); 隐式转换生效 return 0; }使用explicit关键字可以禁止隐式转换只允许显式调用构造cpp运行explicit Person(int n) : num(n) {} // Person p 20; // 报错隐式转换被禁止 Person p(20); // 合法显式调用2. 类型转换运算符对象转基础类型格式operator 目标类型(){}实现对象反向转为普通数据类型。cpp运行class Person { public: int age; Person(int a) : age(a) {} // 类型转换函数对象转 int operator int() { return age; } }; int main() { Person p(18); int a p; // 自动调用转换函数对象转int cout a endl; return 0; }三、static 静态成员静态成员不属于某个单独对象而是属于整个类所有对象共享同一份数据分为静态成员变量和静态成员函数。1. 静态成员变量类内声明类外必须初始化所有对象共用修改一处全部生效cpp运行class Person { public: static int count; // 类内声明 int id; }; int Person::count 0; // 类外初始化 int main() { Person p1; Person p2; p1.count; cout p2.count endl; // 输出 1数据共享 return 0; }2. 静态成员函数可通过类名::直接调用无需创建对象只能访问静态成员不能访问普通成员cpp运行class Person { public: static int count; static void showCount() { cout 总数量 count endl; } }; int Person::count 0; int main() { Person::showCount(); // 类名直接调用 return 0; }四、友元 friend类的私有成员默认外部无法访问友元相当于给外部开了访问权限分为友元函数和友元类。注意友元破坏了封装性日常开发谨慎使用。1. 友元函数让普通函数、全局函数访问类的私有成员cpp运行class Person { private: int num 10; friend void print(Person p); // 声明友元函数 }; // 全局友元函数 void print(Person p) { cout p.num endl; // 正常访问私有成员 } int main() { Person p; print(p); return 0; }2. 友元类将整个类声明为友元友元类中所有成员函数都可以访问当前类的私有内容cpp运行class A { private: int data 99; friend class B; // 声明 B 为友元类 }; class B { public: void test(A a) { cout a.data endl; // 访问A的私有成员 } };五、内部类在一个类的内部定义另一个类嵌套的类称为内部类。内部类作用域隶属于外部类内部类天然是外部类的友元可以直接访问外部类私有成员使用时需要加作用域解析符外部类::内部类cpp运行class Outer // 外部类 { private: int val 100; public: // 内部类 class Inner { public: void func(Outer o) { cout o.val endl; // 访问外部类私有成员 } }; }; int main() { Outer::Inner in; // 定义内部类对象 Outer out; in.func(out); return 0; }六、匿名对象没有变量名的临时对象创建后立即使用本行代码执行完毕就自动销毁常用来简化代码传参、赋值。基本用法cpp运行class Person { public: Person(int a) { cout 构造执行 endl; } ~Person() { cout 析构执行 endl; } }; int main() { Person(20); // 匿名对象本行结束立即销毁 return 0; }常用场景直接给有名对象赋值cpp运行Person p Person(18);作为函数实参cpp运行void test(Person p){} test(Person(15)); // 匿名对象传参七、综合示例知识点整合将以上所有特性整合在一份代码中完整串联练习cpp运行#include iostream using namespace std; class Outer { private: static int s_num; int m_num 20; friend void friendFunc(Outer o); // 友元函数 public: // 构造 初始化列表 Outer(int n) : m_num(n) {} // 静态成员函数 static void showStatic() { cout 静态值 s_num endl; } // 内部类 class Inner { public: void work(Outer o) { cout 内部类访问 o.m_num endl; } }; // 类型转换函数 operator int() { return m_num; } }; int Outer::s_num 66; // 友元函数实现 void friendFunc(Outer o) { cout 友元访问 o.m_num endl; } int main() { Outer::showStatic(); Outer o1(30); Outer::Inner in; in.work(o1); friendFunc(o1); // 类型转换 int res o1; cout 对象转数值 res endl; // 匿名对象 Outer(50); return 0; }