初始化列表
Person ( int a, int b, int c) { m_A = a; m_B = b; m_C = c; }
class Person
{
public : Person ( int a, int b, int c) : m_A ( a) , m_B ( b) , m_C ( c) { } int m_A; int m_B; int m_C;
} ;
这个代码表示Person这个构造函数接受abc三个变量,分别把它们赋值给m_A,m_B,m_C
类对象作为类成员
这个涉及到的问题是构造函数和析构函数的调用顺序问题: 结论:当一个类中的成员变量是另外一个类的时候,会先调用成员变量中另一个类的构造函数,再调用它本身的构造函数。析构函数则是相反的顺序. 下面看例子 这是一个C++的代码,我们创建了一个人类,里面的成员变量包括人的名字和它的手机名字
class Person
{
public : Person ( string name, string P_Name) : m_Name ( name) , m_Phone ( P_Name) { cout << "人类构造函数的调用" << endl; } ~ Person ( ) { cout << "人类析构函数的调用" << endl; } string m_Name; Phone m_Phone;
} ;
所以呢,我们还要创建一个手机类,里面封装着手机的品牌名称
class Phone
{
public : Phone ( string name) : m_Name ( name) { cout << "手机类构造函数的调用" << endl; } ~ Phone ( ) { cout << "手机类析构函数的调用" << endl; } string m_Name;
} ;
手机类构造函数的调用
人类构造函数的调用
张三拿着华为
人类析构函数的调用
手机类析构函数的调用进程已结束,退出代码为 0
静态成员变量
静态成员变量的三个特性: 1 静态成员变量在编译阶段就分配内存了 2 静态成员变量不属于任何一个对象由所有对象共享 3 静态成员变量在类内声明在类外初始化 注意 静态成员变量也是有访问权限的
this 指针的 使用
解决同名冲突
class Person
{
public : Person ( int age) { this -> age = age; } Person AddPerson ( Person & p) { this -> age += p. age; return * this ; } int age;
} ;
void test01 ( )
{ Person p1 ( 18 ) ; cout << "p1 的年龄为: " << p1. age << endl;
} int main ( )
{ test01 ( ) ; return 0 ;
}
如果没有this,打印的结果不会是18,因为存在同名冲突age并没有赋值给成员变量age,加了this之后才可以。
返回值为* *this
class Person
{
public : Person ( int age) { this -> age = age; } Person AddPerson ( Person & p) { this -> age += p. age; return * this ; } int age;
} ;
void test02 ( )
{ Person p1 ( 10 ) ; Person p2 ( 10 ) ; p2. AddPerson ( p1) . AddPerson ( p1) ; cout << "p2的年龄为:" << p2. age<< endl;
}
int main ( )
{
test02 ( ) ; return 0 ;
}
注意函数返回的不是p2本身。每次返回都是一个新的对象,所以没有叠加 如果返回的形式为Person&那么返回的就是它本事,利用链式的特性可以进行叠加
常函数与常对象
# include <iostream>
using namespace std;
class Person
{
public : void showPerson ( ) const { this -> m_B = 100 ; } void func ( ) { } int m_A; mutable int m_B;
} ;
void test01 ( )
{ Person p; p. showPerson ( ) ;
}
void test02 ( )
{ const Person p; p. m_B = 300 ; p. showPerson ( ) ;
}
int main ( )
{ return 0 ;
}
在上述代码中,我们可以得出如下结论: 1 this指针不可以修改它的指向但是可以修改它指向的值2 在成员函数后面加上const
修饰的this指针指向的值,此时this指向的值不可以修改,这就是为什么在常量函数中不可以修改m_A的值,却可以修改特殊类型m_B的值。特殊类型为:mutable 3 常对象只能调用被const修饰的常函数而不可以调用普通函数,所以在test02中调用p.func()会报错。而调用showPerson这个常函数却不会报错。
友元
全局函数做友元
写法在类的开头加上frien “你要作为友元的全局函数的声明” 请看如下代码:
# include <iostream>
# include <string>
using namespace std; class Building
{ friend void goodGay ( Building * building) ;
public : Building ( ) { m_SittingRoom = "客厅" ; m_BedRoom = "卧室" ; }
public : string m_SittingRoom;
private : string m_BedRoom;
} ;
void goodGay ( Building * building)
{ cout << "好基友全局函数正在访问:" << building-> m_SittingRoom << endl; cout << "好基友全局函数正在访问:" << building-> m_BedRoom << endl;
}
void test01 ( )
{ Building building; goodGay ( & building) ;
}
int main ( )
{ test01 ( ) ; system ( "pause" ) ; return 0 ;
}
```cpp
在声明了goodGay这个函数为友元后,它作为特殊的全局变量就可以访问类中的私有成员变量了。
类做友元