类(class)
类是一种用户自定义的类型,包含函数与数据的特殊“结构体”,扩充c++语言的类型体系。
类中包含的函数,称为”成员函数“;包含的数据,称为”数据成员“。
类中函数既可以在类中给出定义,也可以在类外给出定义。
类的成员(数据,函数)可以根据需要分组,不同组设置不同的访问权限。
权限种类:public(公有属性),private(私有属性),protected(保护属性)。用类来定义变量,该变量通常被称为”对象“。
通过”对象名.成员名“的形式,可以使用对象的数据成员,或者调用对象的成员函数,但仅限于public权限的成员。
在类外定义成员函数时,函数名前要加上类名限定,格式为: 类名::函数名,其中::称为域运算符。
成员函数的两种定义方式 :
在类内定义成员函数
#include<iostream>
using namespace std;
class Matrix{
public:
void fill(char dir){
}
};
int main(){
return 0;
}
在类外定义成员函数
#include<iostream>
using namespace std;
class Matrix{
int data[100][100];//缺省属性为private
public:
void fill(char dir);
};
void Matrix::fill(char dir){
}
int main(){
return 0;
}
this指针
在所有成员函数中,隐含着一个只想当前对象的指针变量,其名称为this
#include<iostream>
using namespace std;
class Matrix{
int data[100][100];
public:
void fill(char dir){
this->data[0][0]=1;
}
};
int main(){
return 0;
}
访问对象的成员(数据,函数)不允许用"."操作符访问对象的私有成员和保护对象,对象只能访问它的公有属性的成员(数据,函数)。
对指针采用"->"操作符访问所指对象的公有成员。
友元函数
有时候需要允许某些函数访问对象的私有成员,可以通过声明该函数为类的"友元"来实现
#include<iostream>
using namespace std;
class Test{
int id;
public:
friend void print(Test obj);
};
void print(Test obj){
cout<<obj.id<<endl;
}
int main(){
Test obj;
print(obj);
return 0;
}
//Test类中声明了Test类的友元和函数print
//该函数在实现是可以访问Test类定义的对象的私有成员 如int id
构造函数
类的构造函数由编译器自动生成调用语句,用于对象数据成员的初始化,以及其他初始化工作。构造函数没有返回值类型,函数名与类名相同。类的构造函数可以重载,即可以使用不同的函数参数进行对象初始化。
#include<iostream>
using namespace std;
class Student{
long long ID;
public:
Student(long long id){
ID=id;
}
Student(int year,int order){
ID=year*10000+order;
}
};
int main(){
return 0;
}
不带任何参数的构造函数被称为”默认构造函数“,也称为”缺省构造函数“。
在定义元素为对象的数组时(ClassName array_var[NUM];),类必须提供默认构造函数的定义。使用构造函数(没有参数)来生成对象时,对象定义的格式为ClassName obj;
构造函数可以使用初始化列表来初始化成员函数。
该列表在定义构造函数时使用,位置出现在函数体花括号"{"之前,函数参数列表"()"之后,以冒号":"作开头。
使用”数据成员(初始值)“的形式
#include<iostream>
using namespace std;
class Student{
long long ID;
public:
Student(long long id) :ID(id){}
Student(int year,int order){
ID=year*10000+order;
}
};
int main(){
return 0;
}
委派构造函数
在构造函数的初始化列表中,还可以调用其他构造函数的函数。
#include <iostream>
using namespace std;
class Info{
public:
Info(){Init();}
Info(int i):Info(){id=i;}
Info(char c):Info(){gender=c;}
private:
void Init(){};
int id=2016;
char gender='M';
};
int main(){
}
析构函数:
一个类只有一个析构函数,名称时"~ClassName",没有函数返回值,没有函数参数。编译器在对象生命周期结束时自动调用类的析构函数,以便释放对象占用的资源,或其他后处理。
#include<iostream>
using namespace std;
class ClassRoom{
int num;
long* ID_list;
public:
ClassRoom():num(0),ID_list(0){};
~ClassRoom(){//析构函数
if(ID_list) delete[] ID_list;//释放内存
}
};
int main(){
return 0;
}
拷贝构造函数
函数调用时以类的对象为形参或返回类对象时,编译器会生成自动调用”拷贝构造函数“,在已有对象基础上生成新对象。拷贝构造函数是一种特殊的构造函数,它的参数是语言规定的,是同类对象的常量引用。语义上:用参数对象的内容初始化当前对象。
#include<iostream>
using namespace std;
class Person{
int id;
public:
Person(const Person& src){
id=src.id;
}
};
int main(){
return 0;
}