目录
1 类
类是描述一类事物的特征和行为的统称,抽象的不存在的,泛指的概念,例如:描述一个人,从外观上(特征)和言行举止(行为)上进行描述
1.1 外观上(特征):
长头发
蓝牙眼睛
白皮肤
带了美瞳
年龄多大
身高
体重
.....
1.2 言行举止(行为):
走路
跑步
说话
学习
打游戏
.......
1.3 程序描述
关键字:class -------描述一个类
格式:
class 类名
{
//外观---特征
长头发
蓝牙眼睛
白皮肤
带了美瞳
年龄多大
身高
体重
.....
//言行举止----行为
走路
跑步
说话
学习
打游戏
.......
};
例如:
class People
{
//特征
int eyes;
int age;
int height;
int weight;
char name[20];
.....
//行为
void walk()
{}
void run()
{}
void play()
{}
void study()
{}
..........
};
特征(属性):
指的是变量,称为类的成员变量
行为(方法):
指的是函数,称为类的成员函数
类的成员:
包含了成员变量和成员函数
2 对象
是指类的实例化(实实在在存在的),是特指的概念,例如:人类实例化对象张三、李四、王二等等
2.1 实例化的两种方式
2.1.1 在栈区进行实例化
相当于一个局部变量,只能在对应作用域使用。
格式:
类名 对象名 ; //类名和对象名就是标识符,满足语法规范
例如:
People zhangsan ; //实例化zhangsan对象
People lisi;
......
2.1.2 在堆区进行实例化
格式:
类名 * 对象名 = new 类名;//在堆区开辟类大小的空间,并用对象指向该空间
例如:
People * zhangsan = new People ;
People * lisi = new People ; //注意释放空间:delete zhangsan
3 如何访问类的成员
通过类的对象去进行访问
3.1 对象在栈区实例化
符号:“.”
格式:
对象名 . 成员 ; //访问类的成员
例如:
zhangsan.height=180;
zhangsan.walk();
3.2 对象在堆区实例化
符号:“->”
格式:
对象名 -> 成员 ;//访问类的成员
例如:
zhangsan->height=180;
zhangsan->walk();
4 类的成员访问修饰符
C++提供了三个类的成员修饰符,public(共有)、private(私有)、protected(受保护的),作用是保护类的成员。
4.1 public修饰符
一定要存在于类中
格式:
public:
类的成员
注:
如果类中有其它类的成员修饰符,直到遇到下一个修饰符之前(类的后括号之前)的成员,都是用public修饰
对于public修饰的成员:
在类的外部可以访问
在类的内部可以访问
对于派生类可以访问
对于友元可以访问
4.2 private修饰符
格式:
private:
类的成员
注:
如果类中有其它类的成员修饰符,直到遇到下一个修饰符之前(类的后括号之前)的成员,都是用private修饰
对于private修饰的成员:
在类的外部不可以访问
在类的内部是可以访问
对于派生类不可以访问
对于友元可以访问
4.3 protected修饰符
格式:
protected:
类的成员
注:
如果类中有其它类的成员修饰符,直到遇到下一个修饰符之前(类的后括号之前)的成员,都是用private修饰
对于protected修饰的成员:
在类的外部不可以访问
在类的内部是可以访问
对于派生类可以访问
对于友元可以访问
注:
如果类中的成员没有加任何的修饰符,那么该成员默认是类的私有成员
一般是将类的成员变量放置在private修饰符下(具体情况具体分析)
5 类的构造函数
构造函数的作用是用于构造(创建)对象,是一种特殊的函数,如果用户没有显示的写出构造函数,那么编译器会自动生成一个隐式的不带参的构造函数;如果用户显示的写出构造函数,那么编译器不会自动生成隐式的构造函数。创建对象时会自动调用构造函数(才表示对象创建成功)
构造函数的格式:
类名 (参数列表)
{
//代码
}
例如:
People()
{
//代码
}
注:
创建对象时,要参考构造函数是否带参,如果带参那么创建对象时就需要传递实参
格式:
类名 对象名(实参列表);
例如:
People people(10);
总结:
(1)构造函数可以发生重载
(2)构造函数没有返回值
(3)构造函数的作用是用于构造对象,还可以初始化类的成员变量
6 类的成员变量初始化方式
6.1 类的对象进行初始化
例如:
People people;
people.num=10;
6.2类的构造函数中初始化
例如:
People(int a)
{
num=a; //用a来初始化类的成员num
}
6.3 通过类的构造函数的初始化列表的形式
格式:
类名 ([参数列表]):成员变量1(初始值),成员变量2(初始值),.......
{
//代码
}
例如:
People():num(10) //创建对象时,对类的成员变量num进行初始化为10
{
}
注:
构造函数的调用方式:
(1)实例化对象的方式调用----构造函数的隐式调用
(2)直接通过类方式调用-----构造函数的显示调用
格式:
类名([实参列表]);
例如:
People(10);//构造函数的显示调用
7 类的析构函数
析构函数的作用是用于释放该类所占用的资源(释放对象),在类的对象使用完时(当类的对象超出了作用域),会自动调用析构函数;如果是在堆区实例化的对象,那么当手动释放对象时,会自动调用析构函数
析构函数的原型:
~类名() //析构函数
{
}
例如:
~People()
{
//释放资源
}
8 友元
C++提供友元目的是给类的外部提供一个访问类的私有成员的接口,即可以通过友元访问类的私有成员
友:friend
友元分为友元函数和友元类
8.1 友元函数
关键字:friend
格式:
friend 函数返回值 函数名(参数列表); //声明一个友元函数
例如:
friend void function();//function函数是一个友元函数
注意:
友元函数属不属于类的成员?友元函数不是类的成员函数
将一个类的成员函数可不可以声明为另外一个类的友元?一个类的成员函数声明为另外一个类的友元,可不可以访问另外一个类的私有成员?
编译器提示错误:不可访问(提前声明类)
格式:
friend 返回值类型 类名 ::函数名 (参数列表);
8.2 友元类
关键字:friend
格式:
friend class 类名; //将类声明为友元
例如:
friend class People;
9 this指针
C++中成员函数的特性,在类的非静态成员函数中都会存在一个this指针,来指向当前类,它是隐式的不可见的,是作为函数的第一个参数
可以通过this指针来解决二义性的问题
this指针原型:
类名 * const this ; //this指针的原型
例如:
People * const this;
将this指针作为函数返回值使用:
格式:
类名 & 函数名 ([参数列表])
{
//函数具体实现
return *this; //通过该函数将当前对象进行返回
}
10 static关键字
C++提供的static关键字主要应用于类的成员,对于不是类的成员与C语言的作用是类似
对于类的静态成员讲,它是类的所有对象共享一份,它不是某个对象所特有的
10.1 static声明成员变量
用static声明的成员变量是存储在静态全局区,即全局变量
在C++中不能直接对静态成员变量进行初始化,在类外对它进行初始化
类外初始化格式:
类型 类名 :: 变量名 = 初始值; //在类外初始化
例如:
int People :: number = 10; //在类外初始化
10.2 static声明静态成员函数
格式:
static 返回值类型 函数名 (参数列表)
{
}
例如:
static int get_value()
{
}
静态函数的注意事项:
1)静态成员函数中是否有this指针?答案:没有,为什么?因为存储在静态全局区
2)静态成员函数调用非静态成员?静态成员?答案:不能调用非静态成员,可以调用静态成员
3)非静态成员函数调用非静态成员?静态成员?
10.3 类的静态成员访问方式
1)可以通过类的对象进行访问
例如:
People people;
people.function();//这种方式访问
2)可以通过类进行访问
符号:“::”
格式:
类名 :: 静态成员名 ;//能不能通过这种方式访问类的非静态成员?
例如:
People :: function();
11 const关键字
用const修饰类的成员,就表示成员是不可变,例如:修饰成员变量变量是常量属性
C++中用const修饰类的成员函数,表示成员函数是对类的成员以只读的性质(保护数据成员)
格式:
函数返回值类型 函数名 ([参数列表]) const
{
}
例如:
void function() const
{
}