C++类和对象
1.static成员 2.友元 3.内部类 4.匿名对象 5.对象拷贝时的编译器优化
1.static成员
用static修饰的成员变量叫做静态成员变量,静态成员一定要在类外进行初始化。 静态成员变量为所有类的共享,放入静态区,不属于某个具体对象,不放入对象中。 用static修饰的成员函数叫做静态成员函数,静态成员函数没有this指针。 静态成员函数访问其他静态成员函数,但是不可以访问其他非静态的,因为没有this指针。 非静态成员函数可以任意访问其他静态成员函数和成员变量。 静态成员也是类的成员,受public,protected,private访问限定符的限制。 突破类域就可以访问静态成员函数的对象,通过类的名字::静态成员变量或者对象.静态成员变量来访问静态成员变量和静态成员函数。 静态成员变量不能在声明位置给缺省值初始化,因为缺省值是个构造函数初始化列表的,静态成员变量不属于某个对象,不走构造函数初始化列表。
# include <iostream>
using namespace std;
class A
{
public :
A ( )
{
++ _scount;
}
A ( const A& t)
{
++ _scount;
}
~ A ( )
{
-- _scount;
}
static int GetACount ( )
{
return _scount;
}
private :
static int _scount;
} ;
int A:: _scount = 0 ;
int main ( )
{
cout << A :: GetACount ( ) << endl;
A a1, a2;
A a3 ( a1) ;
cout << A :: GetACount ( ) << endl;
cout << a1. GetACount ( ) << endl;
return 0 ;
}
2.友元
友元提供了⼀种突破类访问限定符封装的方式,友元分为:友元函数和友元类,在函数声明或者类 声明的前面加friend,并且把友元声明放到⼀个类的里面 外部友元函数可访问类的私有和保护成员,友元函数仅仅是⼀种声明,他不是类的成员函数。 友元函数可以在类定义的任何地方声明,不受类访问限定符限制。 ⼀个函数可以是多个类的友元函数 友元类中的成员函数都可以是另⼀个类的友元函数,都可以访问另⼀个类中的私有和保护成员。 友元类的关系是单向的,不具有交换性,比如A类是B类的友元,但是B类不是A类的友元 友元类关系不能传递,如果A是B的友元, B是C的友元,但是A不是C的友元。 有时提供了便利。但是友元会增加耦合度,破坏了封装,所以友元不宜多用。
3.内部类
如果⼀个类定义在另⼀个类的内部,这个内部类就叫做内部类。内部类是⼀个独⽴的类,跟定义在全局相比,他只是受外部类类域限制和访问限定符限制,所以外部类定义的对象中不包含内部类。 内部类默认是外部类的友元类。 内部类本质也是⼀种封装,当A类跟B类紧密关联,A类实现出来主要就是给B类使⽤,那么可以考虑把A类设计为B的内部类,如果放到private/protected位置,那么A类就是B类的专属内部类,其他地方都用不了。
4.匿名对象
⽤ 类型(实参) 定义出来的对象叫做匿名对象,相⽐之前我们定义的 类型 对象名(实参) 定义出来的 叫有名对象 匿名对象⽣命周期只在当前一行,⼀般临时定义⼀个对象当前用⼀下即可,就可以定义匿名对象。
5.对象拷贝时的编译器优化
现代编译器会为了尽可能提高程序的效率,在不影响正确性的情况下会尽可能减少⼀些传参和传返回值的过程中可以省略的拷贝。 如何优化C++标准并没有严格规定,各个编译器会根据情况自行处理。当前主流的相对新⼀点的编译器对于连续⼀个表达式步骤中的连续拷贝会进行合并优化,有些更新更"激进"的编译器还会进行跨行跨表达式的合并优化。