1.(1)类的定义
类就是具有相同数据和相同操作的一组对象的集合。
学生类定义:
class student
{
//成员变量
char* name;
int age;
int sex;
//成员函数
void speak()
{
cout<<name<<"年龄是"<<age<<endl;
}
};注:类的大小与普通数据成员有关,与成员函数和静态成员无关。空类大小为1.
(2).访问限定符
public:声明对类的外部接口,所有来自外部的访问通过接口进行。
private:只允许本类的成员函数来访问,类外部的访问都是非法的。
protected:介于公有和私有类型之间,只有本类和派生类可以访问。
(3).面向对象封装性
封装是指把数据和现实操作的代码集中起来放在对象内部,并尽可能的隐蔽对象的内部细节。
封装具有两层含义:
a.有关数据+操作代码封装在一个对象内,各个对象相互独立,互不干扰。
b.对象中的有些数据+操作代码对外隐蔽称作信息隐蔽。
注:信息隐蔽有利于数据安全,防止无关人员访问和修改。
2.四个默认成员函数
(1)构造函数
私有成员变量要对他们进行初始化,必须用一个公有的成员函数进行,同时这个函数应该在定义对象时执行一次,这是调用的函数称为构造函数。
构造函数是特殊的成员函数
特征:
a.函数名与类型相同
b.无返回值
c.对象构造(对象实例化)时系统自动调用对应的构造函数
d.构造函数可以重载
e.构造函数可以在类中定义,也可以在类外定义
f.如果类定义中没有给出构造函数,则C++编译器自动产生一个缺省的构造函数,只要我们自己定义了一个构造函数,系统就不会自动生成缺省的构造函数
g.无参的构造函数和全缺省的构造函数都认为是缺省构造函数,并且缺省的构造函数只能有一个
#include<iostream> using namespace std; class Date { public: //无参构造函数 Date() {} //带参构造函数 Date(int year, int month, int day) { _year = year; _month = month; _day = day; } //全缺省的构造函数 Date(int year = 2015, int month = 7, int day = 7) { _year = year; _month = month; _day = day; } private: int _year; int _month; int _day; }; int main() { Date d1; //调用无参构造函数 Date d2(2019, 4, 20); //调用带参构造函数 //注意:调用无参构造函数创建对象时,对象后边不用跟括号,否则就成了函数声明 //例如:Date d3(); return 0; }
(2)拷贝构造函数
创建对象时使用同类对象来进行初始化,这时所用的构造函数称为拷贝构造函数,拷贝构造函数是特殊的构造函数。
特征:、
a.拷贝构造函数是一个构造函数的重载
b.拷贝构造函数的参数必须使用引用传参,使用传值方式会引发无穷递归调用
c.若未显示定义,系统会默认缺省的拷贝构造函数。缺省的拷贝构造函数会依次拷贝类成员进行初始化
(3)析构函数
当一个对象的生命周期结束时,C++编译系统会自动调用一个成员函数,这个特殊的成员函数即析构函数。
特点:
a.析构函数在类名前加上字符~
b.析构函数无参数无返回值
c.一个类有且仅有一个析构函数,若未显示定义,系统会自动生成一个缺省的析构函数
d.对象生命周期结束时,C++编译系统自动调用析构函数
e.析构函数体内主要完成清理工作
(4)赋值运算符的重载
赋值运算符的重载是一对一已存在的对象进行拷贝赋值。
注:C++不能重载的运算符:: ?: . * sizeof
3.隐含的this指针
(1)除构造函数外每个成员函数都有一个指针形参,称为this指针,this指针是隐式的。
4.运算符重载
(1)C++只能对已有的C++运算符进行重载,不允许用户自己定义新的运算符
(2)C++运算符只有少数几个不能重载:: ?: . * sizeof
(3)C++重载功能应与原来相似,不能改变运算符操作对象的个数,不能改变运算符原有的优先级.结合特性
(4)运算符重载函数的参数不能全部是C++预定义的基本数据类型
(5)运算符重载函数可以是普通函数、类的成员函数、类的友元函数。