C++基础 类和对象(三)
一.初始化列表语法格式1.为什么要使用初始化列表很多人以为和效果一样实际上并不一样。普通赋值过程先调用成员变量默认构造再进行赋值相当于x先被创建然后x 10初始化列表x在创建时直接变成10少了一次“先创建再赋值”的过程效率更高。示例输出张三 182.初始化列表的执行顺序初始化列表中按照成员变量在类中声明顺序进⾏初始化跟成员在初始化列表出现的的先后顺序⽆ 关。建议声明顺序和初始化列表顺序保持⼀致。真正顺序a先初始化b后初始化3.哪些成员必须使用初始化列表初始化1.const成员因为const变量定义后不能再赋值2.引用成员引用必须在定义时绑定3.没有默认构造的对象成员无法默认构造。总结⽆论是否显⽰写初始化列表每个构造函数都有初始化列表 ⽆论是否在初始化列表显⽰初始化成员变量每个成员变量都要⾛初始化列表初始化二.static成员1.静态成员变量输出3为什么是3因为count 是所有对象共享的每一次创建对象2.static成员变量特点1.属于整个类不是对象独有所有对象共用一份。2.不在对象中存储3.必须类外定义4.类内只是声明5.静态成员也是类的成员受public、protected、private访问限定符的限制。3.static成员访问方式1.类名访问2.对象访问4.静态成员函数输出5.静态成员函数特点1.没有 this 指针2.属于类6.静态成员函数只能访问静态成员错误示例没有this不知道_a属于哪个对象7.⾮静态的成员函数可以访问任意的静态成员变量和静态成员函数。8.静态成员变量不能在声明位置给缺省值初始化因为缺省值是个构造函数初始化列表的静态成员 变量不属于某个对象不⾛构造函数初始化列表。三.友元友元提供了⼀种突破类访问限定符封装的⽅式友元分为友元函数和友元类在函数声明或者类 声明的前⾯加friend并且把友元声明放到⼀个类的⾥⾯。1.友元函数输出102.友元函数的特点1.不是成员函数2.友元关系是单向的A是B的友元不代表B也是A的友元3.⼀个函数可以是多个类的友元函数。3.友元类一个类可以成为另一个类的友元。输出100友元类关系不能传递如果A是B的友元B是C的友元但是A不是C的友元。有时提供了便利。但是友元会增加耦合度破坏了封装所以友元不宜多⽤四.内部类如果⼀个类定义在另⼀个类的内部这个内部类就叫做内部类。内部类是⼀个独⽴的类跟定义在 全局相⽐他只是受外部类类域限制和访问限定符限制所以外部类定义的对象中不包含内部类。这里B就是A的内部类内部类默认是外部类的友元类内部类本质也是⼀种封装当A类跟B类紧密关联A类实现出来主要就是给B类使⽤那么可以考 虑把A类设计为B的内部类如果放到private/protected位置那么A类就是B类的专属内部类其 他地⽅都⽤不了。五.匿名对象⽤类型(实参)定义出来的对象叫做匿名对象相⽐之前我们定义的类型对象名(实参)定义出来的 叫有名对象输出这里 A()创建了一个对象但没有名字所以叫匿名对象匿名对象的特点1.没有对象名2.生命周期只有当前语句这一句结束对象立即销毁