目录
类的定义
class className{
}; //注意分号
类的两种定义方式:
1、声明和定义都放在类体中(注意:成员函数如果在类中定义,编译器可能会将其当作内联函数处理)
class Person {
public:
void show() {
cout << _name << "-" << _sex << "-" << _age << endl;
}
public:
char* _name;
char* _sex;
int _age;
};
2、声明放在头文件当中,定义放在源文件中。
一般情况下,推荐方式二。
类的访问限定符
种类:public(公有);protected(保护) ;private(私有的)
注意:访问限定符只在编译时有用,当数据映射到内存后,没有任何访问限定符上的区别。
类的作用域
C++中的作用域:全局作用域、函数体内部的局部作用域、命名空间、类域
类域:类定义了一个新的作用域,类的所有成员都在类的作用域中。在类外定义成员,需要使用::作用域解析符指明成员属于哪个类域。
类的实例化
用类类型的创建对象的过程成为类的实例化
类只是一个模型一样的东西,限定了类有那些成员,定义出一个类并没有分配实际的内存空间来存储它。
一个类可以实例化出多个对象,实例化出的对象占用实际的物理空间,存储类成员变量。
类对象模型
计算类对象的大小
空类的大小:
this指针
C++编译器给每个“非静态的成员函数”增加一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
this指针的特性:
this指针存在哪里?
this指针可以为空吗?
类的六个默认成员函数:
构造函数
特点:
但此时不能再用默认无参构造函数了,如果想用无参构造,可以传递全缺省参数。
编译器生成的默认的构造函数到底有什么用?
C++把类型分为内置类型(基本类型)和自定义类型。内置类型就是语法已经定义好的类型:如int/char,自定义类型就是我们使用class/struct/union自己定义的类型,看下面的程序,就会发现编译器生成默认的构造函数会对自定义类型成员_t调用它的默认函数。
class Time
{
public:
Time()
{
cout << "Time()" << endl;
_hour = 0;
_minute = 0;
_second = 0;
}
private:
int _hour;
int _minute;
int _second;
};
class Date {
private:
int _year;
int _month;
int _day;
Time _t;
};
int main() {
Date d2;
return 0;
}
析构函数:
概念:
特点:
拷贝构造函数:
概念:只有单个形参,该形参是对本类类型对象的引用(一般使用const修饰),在用已存在的类类型对象创建新对象的时候,由编译器自动调用。
特性:
运算符重载:
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通函数类似。
函数名字为:关键字operator后面接需要重载的运算符符号。
函数原型:返回值类型 operator操作符(参数列表)
作为类成员的重载函数:
注意事项:
赋值运算符重载:
1、形式
2、参数类型:
一般都是类类型对象的引用,相较于传值这样就会少了形参实例化的拷贝构造
3、返回值:
一般返回*this
是类类型对象的引用
4、检测是否在给自己赋值
if(this != &d)
const成员
const修饰类的成员函数:
1、const对象可以调用非const成员函数吗?
2、非const对象可以调用const成员函数吗?
3、const成员函数内可以调用其他的非const成员函数吗?
4、非成员函数内可以调用其他的const成员函数吗?
取地址及const取地址操作符重载
这两个默认成员函数一般不用重新定义,编译器默认会生成。
这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况才需要重载,比如想获取到指定的内容。
再谈构造函数
构造函数体赋值:
初始化列表:
explicit关键字
构造函数不仅可以构造与初始化对象,对于单个参数的构造函数,还具有类型转换的作用。如下:
加上关键字,将会禁止单参构造函数的隐式转化:
static成员:
静态成员变量:
特性:
面试题:实现一个类,计算程序中创建了多少类对象。
静态成员函数:
特性:
友元
友元函数
当我们尝试重载operator<<的时候,会发现我们没办法将operator<<重载成成员函数:
这样就可以了:
友元函数的使用:
友元函数注意事项:
友元类
内部类
概念:
特性: