天河区营销型网站建设,购物网站建设方案书,html企业网站模板下载,做网站的分辨率要多大1.初始化列表 在创建对象时#xff0c;编译器通过调用构造函数#xff0c;给对象中各个成员变量一个合适的初始值#xff0c;构造函数体中的语句只能将其称作为赋初值#xff0c;而不能称作初始化#xff0c;因为初始化只能初始化一次(初始化的本质就是只能初始化一次)编译器通过调用构造函数给对象中各个成员变量一个合适的初始值构造函数体中的语句只能将其称作为赋初值而不能称作初始化因为初始化只能初始化一次(初始化的本质就是只能初始化一次)而构造函数体内可以多次赋值 ①.以一个冒号开始:接着是一个以逗号分隔的数据成员列表每个成员变量后面跟一个放在括号中的初始值或者表达式 ②.初始化列表是每个成员定义的地方不管你写不写每个成员都要走初始化列表不写的话内置类型为随机值自定义类型会调用默认构造 ③.在声明给值是缺省值而非定义这个缺省值是给初始化列表用的如果初始化列表没有显式给值就用这个缺省值如果显式给值就不用这个缺省值 ④.每个成员在初始化列表中只能出现一次(初始化只能初始化一次) ⑤.类中包含以下成员必须在初始化列表位置进行初始化 引用成员变量 - 引用必须在定义的时候初始化而初始化列表是每个成员定义的地方 const成员变量 -const常量必须在定义的时候初始化 自定义类型成员(该类没有默认构造函数) ⑥.成员变量在类中的声明顺序就是其在初始化列表中的初始化顺序与其在初始化列表中的先后次序无关 2.explicit关键字 构造函数不仅可以构造与初始化对象对于单个参数的构造函数还具有类型转换的作用
A aa22;
//用2构造一个临时对象再用这个临时对象拷贝构造aa2
//但编译器会优化直接用2构造对象只需要调用一次构造函数而不用先调用构造函数再拷贝构造const Aref2;
//必须用const修饰因为2会生成一个临时变量临时变量具有常性类似
int i0;
double d1.1;
id;
//中间会生成一个临时变量c11支持多参数的转换
B bb2{2,2};
const Bref{3,3};如果用explicit修饰构造函数将会禁止单参构造函数的隐式转换 3.static成员 声明为static的类成员称为类的静态成员用static修饰的成员变量称为静态成员变量用static修饰的成员函数称为静态成员函数静态的成员变量一定要在类外进行初始化 ①.静态成员为所有类所共享不属于某个具体的实例(静态成员变量属于整个类) ②.静态成员变量必须在类外定义定义时不添加static关键字 在类内 static int n; 类外 int A::n0; ③.类静态成员既可用类名::静态成员 也可以用对象.静态成员来访问 ④.静态成员函数没有隐藏的this指针不能访问任何非静态成员 ⑤.静态成员与类的普通成员一样也有publicprivateprotected3种访问级别也可以具有返回值 A*ptrnullptr; coutnmendl; 这里ptr-n,虽然ptr是空指针但是n是静态成员变量与用空指针调用成员函数一样都是可以的 有没有解引用不能看形态要看存放的位置 static intgetm(){ return m;} 用引用返回可以修改m A::getm(); 私有与保护限制的是不能在类外访问但是这个函数返回m不受影响
实现一个类计算程序中创建出了多少个类对象
class A{public:A(){n;m;}A(const At){n;m;}~A(){--n;}private:int m;int n;
};m代表一共创建了多少对象 n代表目前还有多少对象
求123…n要求不能使用乘除法forwhileif elseSwitch case位运算
class solution{class sum{public:sum(){_reti;_i1;} };public:int getsum(int n){sum a[n];return _ret; }private:static int _ret;static int _i;
};
int solution::_ret1;
int solution::_i0;4.友元 友元分为:友元函数和友元类 友元函数提供了一种突破封装的方式有时提供了便利但是友元会增加耦合度破坏了封装所以友元不宜多用。
友元函数
比如之前想要重载符号cout的输出流对象和隐藏的this指针都在抢第一个参数的位置this指针默认是第一个参数但如果构造正常函数将this指针放在第二个参数会导致类外无法访问私有成员故采用友元 友元函数可以直接访问类的私有成员和保护成员它是定义在类外的普通函数不属于任何类不是类的成员函数但需要在类的内部声明声明时需要加friend关键字 ①.友元函数不能用const修饰静态成员函数也不能用const修饰因为const修饰的实质上是形参this指针而友元函数和静态成员函数都没有this指针 ②.友元函数可以在类定义的任何地方声明不受类访问限定符的限制 ③.一个函数可以是多个函数的友元函数 ④.友元函数的调用与普通函数的调用和原理相同
友元类 ①.友元类的所有成员函数都可以是另一个类的友元函数都可以访问另一个类的非公有成员 ②.友元类是单向的不具有交换性 ③.在time类中声明date类为其友元类那么可以在date类中直接访问time类的私有成员变量但不能在time类中访问date类的私有成员变量 ④.友元关系不能传递如果B是A的友元C是B的友元不能说C是A的友元
class Date;//前置声明
class Time;
{friend class Date;//声明Date类是Time类的友元类可以在Date类中直接访问Time类的私有成员变量public:Time(int hour,int minute,int second):_hour(hour),_minute(minute);,_second(second);{}private:int _hour;int _minute;int _second;
};
class Date{public:Date(int year1900,int month1,int day1):_year(year);,_month(month);,_day(day);{}void settimeofdate(int hour,int minute,int second){_t.hourhour;_t.minuteminute;_t.secondsecond;//因为已经声明了Date类为Time类的友元类故Date类可以访问Time类的私有成员变量}private:int _year;int _month;int _day;Time _t;
};5.内部类 如果一个类定义在另一个类的内部这个内部类就叫做内部类此时内部类是一个独立的类不属于外部类不能通过外部类的对象去调用内部类外部类对内部类没有任何优越的访问权限 内部类是外部类的友元类内部类可以通过外部类的对象参数来访问外部类中的所有成员但是外部类不是内部类的友元(友元关系不具有交换性) ①.内部类可以定义在外部类的Public,protected,private都是可以的 ②.内部类可以直接访问外部类的static枚举成员不需要外部类的对象/类名 ③.sizeof(外部类)外部类和内部类没有任何关系
#include iostream
using namespace std;
class A{private:static int k;int h;public:class B{public:void fun(){k1;//内部类可以直接访问外部类的static不需要对象名/类名A aa1;aa._h1;//内部类是外部类的友元类可以访问外部类的私有成员变量}};
};
int A::k0;