类和对象
- 一.初始化列表
- 二.隐式类型转换与explicit
- 三.静态成员——static
- 四.友元
- 五.内部类
- 六.匿名对象
- 七.对象拷贝时的编译器优化
一.初始化列表
之前我们实现构造函数时,初始化成员变量主要使用函数体内赋值,构造函数初始化还有一种方式,就是初始化列表,初始化列表的使用方式是以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。B、
外部友元函数可访问类的私有和保护成员但是不允许修改
,友元函数仅仅是⼀种声明,他不是类的成员函数。建议声明顺序和初始化列表顺序保持一致。
#include<iostream>usingnamespacestd;classB;classA{friendvoidfunc(constA&aa,constB&bb);private:int_a1 =1;int_a2 =2;};classB{friendvoidfunc(constA&aa,constB&bb);private:int_b1 =3;int_b2 =4;};voidfunc(constA&aa,constB&bb){cout <<aa._a1 <<endl;cout <<bb._b1 <<endl;}intmain(){A aa;B bb;func(aa,bb);return0;}
- 友元类中的成员函数都可以是另一个类的友元函数,都可以访问另一个类中的私有和保护成员。
突破类域就可以访问静态成员,可以通过类名::静态成员
或者对象.静态成员
来访问静态成员变量和静态成员函数。
静态成员函数中可以访问其他的静态成员,但是不能访问非静态的,因为没有this指针。
静态成员也是类的成员,受public、
有时提供了便利。
#include<iostream>#include<algorithm>usingnamespacestd;classA{public:A(inta =0):_a(a){cout <<"A(int a)"<<endl;}~A(){cout <<"~A()"<<endl;}private:int_a;};classSolution{public:intSum_Solution(intn){returnn;}};boolmyfunction(inti,intj){returni >j;}intmain(){A aa1;A();A(1);Solution st;cout <<st.Sum_Solution(10)<<endl;cout <<Solution().Sum_Solution(10)<<endl;inta[]={5,3,6,9,8,4,2,1,7};sort(a,a +9);sort(a,a +9,myfunction);greater<int>gt;sort(a,a +9,gt);sort(a,a +9,greater<int>());return0;}
七.对象拷贝时的编译器优化
了解就行:
现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少一些传参和传返回值过程中可以省略的拷贝。
友元函数可以在类定义的任何地方声明,不受类访问限定符限制。A、
静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。
#include<iostream>usingnamespacestd;classTime{public:Time(inthour =0):_hour(hour){cout <<"Time()"<<endl;}private:int_hour;};classDate{public:Date(int&xx,intyear,intmonth,intday):_year(year),_month(month),_day(day),_ptr((int*)malloc(12)),_n(100),_ref(xx),_t(1){if(_ptr ==nullptr){perror("malloc fail!");}else{memset(_ptr,0,12);}}voidPrint()const{cout <<_year <<"/"<<_month <<"/"<<_day <<endl;}private:int_year =1;int_month;int_day;int*_ptr;constint_n;int&_ref;Time _t;};intmain(){intxx =200;Date d1(xx,2024,7,20);d1.Print();return0;}

面试题

#include<iostream>usingnamespacestd;classA{public:A(inta):_a1(a),_a2(_a1){}voidPrint(){cout <<_a1 <<" "<<_a2 <<endl;}private:int_a2 =2;int_a1 =2;};intmain(){A aa(1);aa.Print();return0;}
有一个类A,其数据成员如下: 则构造函数中,成员变量一定要通过初始化列表来初始化的是:bc
classA{private:inta;public:constintb;float*&c;staticconstchar*d;staticdouble*e;};
二.隐式类型转换与explicit
C++支持内置类型隐式类型
转换为类类型对象
,需要有相关内置类型为参数的构造函数。每个构造函数都有初始化列表
。
#include<iostream>usingnamespacestd;classA{public:A(inta1){_a1 =a1;}A(inta1,inta2){_a1 =a1;_a2 =a2;}A(constA&a){_a1 =a._a1;_a2 =a._a2;}voidPrint(){cout <<_a1 <<" "<<_a2 <<endl;}private:int_a1;int_a2;};intmain(){A a1(1);a1.Print();A a2 =2;a2.Print();inti =1;doubled =i;A&ra1 =a1;constA&ra1 =2;inti =1;doubled =i;constdouble&rd =i;return0;}


#include<iostream>usingnamespacestd;classA{public:A(inta1 =0){_a1 =a1;}voidPrint(){cout <<_a1 <<endl;}private:int_a1;};classStack{public:voidPush(constA&a){}private:A _arr[10];int_top;};intmain(){Stack st;A a1(1);st.Push(a1);st.Push(3);return0;}

#include<iostream>usingnamespacestd;classA{public:A(inta1 =0,inta2 =0):_a1(a1),_a2(a2){}voidPrint(){cout <<_a1 <<endl;}private:int_a1;int_a2;};classStack{public:voidPush(constA&a){}private:A _arr[10];int_top;};intmain(){Stack st;A a1 ={1,1};A&ra1 =a1;st.Push(ra1);st.Push({1,1});constA&ra1 ={2,2};return0;}
三.静态成员——static
用static修饰的成员变量,称之为静态成员变量,静态成员变量一定要在类外进行初始化。