C++类与对象基础续
目录
1.static成员
2.友元
3.内部类
4.匿名对象
5.对象拷贝时的编译器优化
1.static成员
1. 用static修饰的成员变量叫静态成员变量,静态成员变量必须在类内声明,类外初始化; 2. 静态成员变量为类的所有对象共有,不属于某个具体对象,不存储在对象中,存放在静态区。
上面两种方式都是错误的,因为静态成员变量不属于某个具体对象,所以不走构造函数初始化列表,所以也不能在声明位置给缺省值初始化。
类内声明,类外初始化才是正确的。
静态成员变量不存放在对象中。
3. 静态成员变量也是类的成员,受public,protected,private访问限定符的限制。
4.用static修饰的成员函数叫静态成员函数,静态成员函数没有this指针。
5.所以静态成员函数只能访问静态成员变量,无法访问非静态成员变量,因为没有this指针。
6.而非静态成员函数可以访问静态成员变量和静态成员函数
7.突破类域可以访问静态成员(public的),可以通过 类名::静态成员 或者 对象.静态成员来访问静态成员变量和静态成员函数。
静态的对象只构造一次,且是在第一次运行到它时才构造。
2.友元
1.友元提供了一种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类的声明前加一个friend,并且把友元声明放到类里面。
2.外部友元函数可以访问类的私有和保护成员,友元函数仅仅是一种声明,它不是类的成员函数。
3.友元函数可以在类的任何地方声明,不受类访问限定符的限制。
4.一个函数可以是多个类的友元函数。
5.友元类中的成员函数可以是另一个类的友元函数,都可以访问另一个类的私有和保护成员。
6.友元关系是单向的,不具有交换性。
7.友元关系不能传递。
3.内部类
1.如果一个类定义在另一个类的内部,这个类就叫做内部类。内部类是一个独立的类,与定义在全局相比,它只是受外部类类域限制,和访问限定符限制,所以外部类定义的对象中不包含内部类。
2.内部类默认是外部类的友元类。
3.内部类本质也是一种封装,当A类与B类紧密关联时,A类实现出来主要就是为了给B类使用,那么可以考虑把A类设计为B类的内部类,如果把A类放到private / protected位置,那么A类就是B类的专属内部类,其它地方就都用不了了。
内部类这个东西,C++中用的还是比较少的。
4.匿名对象
1. 用 类型(实参) 定义出来的对象叫做匿名对象,一般的 类型 对象名(实参) 定义出来的叫有名对象。
2. 匿名对象生命周期只在当前这一行,临时对象生命周期也是只在这一行,有名对象的生命周期是跟着对象走的,但是const可以延长临时对象和匿名对象的生命周期。
5.对象拷贝时的编译器优化
1. 现代编译器为了尽可能提高程序的效率,在不影响正确性的情况下,会尽可能减少在传参和传返回值的过程中可以省略的拷贝构造。
2. 关于如何优化C++标准并没有严格规定,各个编译器会根据情况自行处理,当前主流的比较新的编译器会对一个表达式步骤中连续的拷贝进行合并优化,有些更新更激进的编译器还会进行跨行跨表达式的合并优化。
这些了解即可,直到编译器会进行优化就行了。