c++类和对象以及成员函数的总结

来源:互联网 发布:书生商友软件下载 编辑:程序博客网 时间:2024/06/05 10:35

=====================================================================================================================

类和对象

类包含成员变量和成员函数, 
c++的数据类型有

  • 基本数据类型(字符char,整型int,浮点型float,逻辑型bool,空类型void)
  • 非基本数据类型(数组type[],指针type*,结构体struct,联合体union,枚举enum,类class)。

类中的三种访问限定符public(公有),private(私有),protect(保护)。

  • public成员可从类外部直接访问,private/protected成员不能从类外部直接访问。
  • 每个限定符在类体中可使用多次,它的作用域是从该限定符出现开始到下一个限定符之前或类体结束前。
  • 类体中如果没有定义限定符,则默认为私有的。
  • 类的访问限定符体现了面向对象的封装性。

类的作用域有: 局部域,全局域,类域,名字空间域。

  • 每个类都定义了自己的作用域,类的成员(成员函数/成员变量)都在类的这个作用域内,成员函数内可任意访问成员变量和其它成员 函数。
  • 对象可以通过 . 直接访问公有成员,指向对象的指针通过 -> 也可以直接访问对象的公有成员。
  • 在类体外定义成员,需要使用:: 作用域解析符指明成员属于哪个类域

类大小的计算方法

类只计算其成员变量的大小,其计算方法和结构体的计算方法相同即:

  • 第一个成员在与结构体变量偏移量为0的地址处。
  • 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 //对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的值为8 gcc中的默认值为4
  • 结构体总大小为最大对齐数(每个成员变量除了第一个成员都有一个对齐数)的整数倍。
  • 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体 的对齐数)的整数倍。

空类的大小为1,理论上是0,但这个类被定义就会有空间的开辟,在不同的编译器上空类的大小也不一样,如果一个类中只存在一个虚函数,则编译器为其分配一个指针。在64位平台下大小为8,32位平台下大小为4.

默认成员函数

一个类有六个默认的成员函数,包括(构造函数, 拷贝构造,析构函数,运算符重载,取地址操作符重载, const修饰的取地址操作符重载),其中常用的四个默认成员函数分别是: 
1,构造函数

    class AA
{
public:
AA() // 无参构造函数
{}
AA(char name, int age, char sex); //带参数的构造
private:
char _name;
int _age;
char _sex;
};

成员变量为私有的,要对它们进行初始化,必须用一个公有成员函数来进行。同时这个函数应该有且仅在定义对象时自动执行一次,这时 调用的函数称为构造函数(constructor) 。 构造函数是特殊的成员函数,其特征如下:

  • 函数名与类名相同。
  • 无返回值。
  • 对象构造(对象实例化)时系统自动调用对应的构造函数。
  • 构造函数可以重载。
  • 构造函数可以在类中定义,也可以在类外定义。
  • 如果类定义中没有给出构造函数,则C++编译器自动产生一个缺省的构造函数,但只要我们定义了一个构造函数,系统就不会自动 生成缺省的构造函数。
  • 无参的构造函数和全缺省值的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个。

2,拷贝构造函数

class AA
{
public:
AA(const AA& a)
{
_name = a._name;
_age = a._age;
_sex = a._sex;
}
private:
char _name;
int _age;
char _sex;
};

创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数(Copy Constructor),拷贝构造函数是特殊的构造函 数。 
特征:

  • 拷贝构造函数其实是一个构造函数的重载。
  • 拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用。
  • 若未显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会,依次拷贝类成员进行初始化。

3,析构函数

class AA
{
public:
~AA()
{} //做一些清理工作比如说动态开辟的内存归还给内存池
private:
char _name;
int _age;
char _sex;
};

当一个对象的生命周期结束时,C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数(destructor) 
构造函数是特殊的成员函数,其特征如下:

  • 析构函数在类名加上字符~。 
    析构函数无参数无返回值。
  • 一个类有且只有一个析构函数。若未显示定义,系统会自动生成缺省的析构函数。
  • 对象生命周期结束时,C++编译系统系统自动调用析构函数。
  • 注意析构函数体内并不是删除对象,而是做一些清理工作。

4,运算符重载 
为了增强程序的可读性,C++支持运算符重载。 
运算符重载特征:

  • operator+ 合法的运算符 构成函数名(重载<运算符的函数名:operator< )。
  • 重载运算符以后,不能改变运算符的优先级/结合性/操作数个数。 
    5个C++不能重载的运算符: .* / :: / sizeof / ?: / . 
    c++提供运算符的重载就是为了让不同的类能进行只有基础类型才能做的事,这就需要你为你所定义的类写一个运算符重载的函数,使其能进行正常的算术运算。

隐含的this指针

class Date
{
public:
void Display()
{
cout << _year << "-" << _month << "-" << _day << endl;
}
Date(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
Date(const Date &d)
{
_year = d._year;
_month = d._month;
_day = d._day;
}
private:
int _year;
int _month;
int _day;
};

上述代码中Display函数为何没有参数也可以使用私有的成员变量?因为其实这个函数是这样的Display(Date& this),这里有一个隐含的this指针,通过this指针才能访问这些私有成员,

  • 若this指针不能被修改时应写成这样Display()const ,const修饰this指针,
  • 通常情况下this指针是被隐含在参数中的且永远是第一个参数,所以参数中不能再出现this,但在函数体中可以随意使用this。
阅读全文
0 0