C++基础入门:类和对象(下)

张开发
2026/5/12 20:30:42 15 分钟阅读
C++基础入门:类和对象(下)
◆博主名称少司府欢迎来到少司府的博客☆*: .. o(≧▽≦)o ..:*☆⭐数据结构系列个人专栏初阶数据结构_少司府的博客-CSDN博客⭐C基础个人专栏C初阶_少司府的博客-CSDN博客⭐名不显时心不朽再挑灯火看文章目录一、类型转换二、再探构造函数三、static 成员3.1 定义及性质3.2 static 成员的运用四、友元4.1 友元函数4.2 友元类五、内部类六、匿名对象6.1 匿名对象定义6.2 匿名对象例子七、对象拷贝时编译器的优化一、类型转换1、C⽀持内置类型隐式类型转换为类类型对象需要有相关内置类型为参数的构造函数。A aa1; // 隐式类型转换先用1构造一个临时对象再拷贝构造给aa此处编译器会优化面对连续的构造和拷贝构造编译器会合二为一其意义如下A aa1{2,2}; // A有两个参数C11支持该写法 st.Push(aa1); //可以直接写为 st.Push({2,2});2、构造函数前⾯加explicit就不再⽀持隐式类型转换。explicit A() { //... }3、类类型的对象之间也可以隐式转换需要相应的构造函数⽀持B b aa3; const B rb aa3; // 引用指向aa3构造出的临时对象二、再探构造函数1、构造函数完成初始化还可以使用初始化列表以冒号开始以逗号分割成员变量括号后跟初始值或表达式2、每个成员变量在初始化列表内只能出现一次语法上可以理解为在列表中定义并初始化每个成员变量3、const成员、引用成员以及没有默认构造的自定义成员必须用初始化列表完成初始化class Date {public: Date(int year,int month,int day) :_year(year) ,_month(month) ,_day(day) ,_n(1) ,_ra(2) ,_t(3) private: int _year2026,_month4,_day12; // C11的补丁给出缺省值只是声明不是定义没有开空间 const int _n; // 不是缺省构造函数、没有传参的时候 int ra; // 若没有完成初始化就会用这里的缺省值 Time _t; }4、除了静态成员外每个成员都要先走初始化列表5、初始化列表中成员变量按声明顺序进行初始化三、static 成员3.1 定义及性质1、用static修饰的成员变量叫做静态成员变量需要在类外初始化2、静态成员被该类的所有成员共享不属于某个具体对象不存储在对象中在静态区3、静态成员函数没有this指针只能访问静态成员class A {public: static void GetCount() { _a; cout _a endl; } private: static int _a; }; int A::_a1;3.2 static 成员的运用求123...n_牛客网题目描述如图求1加到n的和不能用公式乘除法、循环、条件判断语句这里我们可以用类和对象的知识解题。如图传入n我们构造n个对象每构造一次 _i 记录是第几次构造_ret_i 加上之前的结果返回递加之和。四、友元4.1 友元函数1、友元提供了⼀种突破类访问限定符封装的⽅式友元分为友元函数和友元类在函数声明或者类 声明的前⾯加friend并且把友元声明放到⼀个类的⾥⾯。2、外部友元函数可访问类的私有和保护成员友元函数仅仅是⼀种声明他不是类的成员函数3、友元函数可以在类定义的任何地⽅声明不受类访问限定符限制。4、⼀个函数可以是多个类的友元函数。class B; // 前置声明告诉编译器有个类叫B class A{ friend void Func(const A aa,const B bb); private: int _a11; int _a22; }; class B{ //... }; void Func(const A aa,const B bb) { cout aa._a1 bb._b1 endl; }4.2 友元类1、友元类中的成员函数都可以是另⼀个类的友元函数都可以访问另⼀个类中的私有和保护成员。class A{ friend class B; // 友元类B中可访问A中所有成员B是A的友元类 private: // friend class 是友元类名放在被访问类的内部 int _a11; };2、有时提供了便利。但是友元会增加耦合度破坏了封装所以友元不宜多⽤。·友元类的关系是单向的不具有交换性⽐如A类是B类的友元但是B类不是A类的友元。·友元类关系不能传递如果A是B的友元B是C的友元但是A不是C的友元。五、内部类1、如果⼀个类定义在另⼀个类的内部这个类就叫做内部类。内部类是⼀个独⽴的类跟定义在全局相⽐他只是受外部类类域限制和访问限定符限制所以外部类定义的对象中不包含内部类。2、内部类默认是外部类的友元类。class A { private: static int _k; int _h 1; public: class B // B默认就是A的友元 { public: void foo(const A a) { cout _k endl; //OK cout a._h endl; //OK } int _b1; }; }; int A::_k 1;内部类本质也是⼀种封装当A类跟B类紧密关联A类实现出来主要就是给B类使⽤那么可以考 虑把A类设计为B的内部类如果放到private/protected位置那么A类就是B类的专属内部类其 他地⽅都⽤不了。六、匿名对象6.1 匿名对象定义1、⽤类型(实参)定义出来的对象叫做匿名对象相⽐之前我们定义的类型对象名(实参)定义出来的叫有名对象。2、匿名对象⽣命周期只在当前⼀⾏⼀般临时定义⼀个对象当前⽤⼀下即可就可以定义匿名对象。6.2 匿名对象例子class A{ //... }; int main() { A();// 匿名对象生命周期只在当前这一行 A(1); return 0; }七、对象拷贝时编译器的优化1、现代编译器会为了尽可能提高程序在不影响正确性的情况下会尽可能减少一些传参和传返回值过程中可以省略的拷贝A aa11; // 构造拷贝构造编译器优化只有构造 const A aa21; // 构造引用指向构造出的临时对象2、如何优化C标准并没有严格规定取决于各个编译器的实现A f2() { A aa; //构造 return aa; //传值返回生成临时对象拷贝构造给生成的临时对象 } int main() { f2().Print(); // 构造拷贝构造 return 0; }本期的分享就到这里如果觉得博主的文章比较对胃口的话可以点一个小小的关注~您的三连是我持续更新的动力~

更多文章