CPP面向对象-类的静态成员
使用 static
关键字来把类成员定义为静态的。当声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。
静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。
我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 ::
来重新声明静态变量从而对它进行初始化。
使用 static
关键字来把类成员定义为静态的。当声明类的成员为静态时,这意味着无论创建多少个类的对象,静态成员都只有一个副本。
静态成员在类的所有对象中是共享的。如果不存在其他的初始化语句,在创建第一个对象时,所有的静态数据都会被初始化为零。
我们不能把静态成员的初始化放置在类的定义中,但是可以在类的外部通过使用范围解析运算符 ::
来重新声明静态变量从而对它进行初始化。
一个指向 C++ 类的指针与指向结构的指针类似,访问指向类的指针的成员,需要使用成员访问运算符 ->
,就像访问指向结构的指针一样。与所有的指针一样,必须在使用指针之前,对指针进行初始化。
在 C++ 中,每一个对象都能通过 this
指针来访问自己的地址。this
指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。
友元函数没有 this
指针,因为友元不是类的成员。只有成员函数才有 this
指针。
类的友元函数是定义在类外部,但有权访问类的所有私有(private
)成员和保护(protected
)成员。尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数。
友元可以是一个函数,该函数被称为友元函数
;
友元也可以是一个类,该类被称为友元类
,在这种情况下,整个类及其所有成员都是友元。
使用关键字 friend
,定义 友元函数
与 友元类
。
1 | // 友元函数 |
拷贝构造函数是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
原则:
拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const
修饰)是对该类类型的引用。
当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。
当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。
C++支持两种初始化形式:
拷贝初始化 int a = 5;
和直接初始化 int a(5);
对于其他类型没有什么区别,对于类类型直接初始化直接调用实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数,也就是说:
1 | A x(2); //直接初始化,调用构造函数 |
必须定义拷贝构造函数的情况:
只包含类类型成员或内置类型(但不是指针类型)成员的类,无须显式地定义拷贝构造函数也可以拷贝;
有的类有一个数据成员是指针,或者是有成员表示在构造函数中分配的其他资源,这两种情况下都必须定义拷贝构造函数。
什么情况使用拷贝构造函数:
类的对象需要拷贝时,拷贝构造函数将会被调用。以下情况都会调用拷贝构造函数:
如果在类中没有定义拷贝构造函数,编译器会自行定义一个。如果类带有指针变量,并有动态内存分配,则它必须有一个拷贝构造函数。
C++ 内联函数是通常与类一起使用。如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方。
对内联函数进行任何修改,都需要重新编译函数的所有客户端,因为编译器需要重新更换一次所有的代码,否则将会继续使用旧的函数。
如果想把一个函数定义为内联函数,则需要在函数名前面放置关键字 inline
,在调用函数之前需要对函数进行定义。如果已定义的函数多于一行,编译器会忽略 inline
限定符。
在类定义中的定义的函数都是内联函数,即使没有使用 inline
说明符。
类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。
::
:范围解析运算符,也叫做作用域区分符,指明一个函数属于哪个类或一个数据属于哪个类。::
:可以不跟类名,表示全局数据或全局函数(即非成员函数)。
成员函数可以定义在类定义内部,或者单独使用范围解析运算符 ::
来定义,调用成员函数是在对象上使用点运算符(.
)。
C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,允许存储不同类型的数据项。
C++ 中的 struct
对 C 中的 struct
进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,包括一下的功能:
struct
可以包含成员函数struct
可以继承吗struct
可以实现多态struct
和 class
的区别:
默认的继承访问权限。struct
是 public
的,class
是 private
的。
使用 struct
语句。struct
语句定义了一个包含多个成员的新的数据类型:
1 | struct type_name { |