C++是一种面向对象的高级程序设计语言。面向对象是C++相较于标准C的最大特性。在C++面向对象的编程中,类是最基础也是最重要的一种数据封装形式。本文主要简介类的定义,使用等。
类简介
类,即“用户定义的类型”,是一种类似标准C中结构体struct
的数据类型,但它具有更高的灵活性。它是一种封装了数据和函数的组合,类中的数据称为成员变量,函数称为成员函数。类可以被看作是一种模板,可以用来创建具有相同属性和行为的多个对象。
类定义/声明
使用class
关键字来定义一个类。类的基本框架如下:
class classname
{
AS:
variables;
functions;
};
其中,classname
是用户定义的类的名称,AS
是访问修饰符(下文解释),variables
和’functions’分别是类的成员变量和成员函数。
为了更好地理解类,以下给出了一个实例,定义了一个名为student
的类:
class student
{
public:
string name;
bool gender;
int score;
int number;
student() {};
~student() {};
void setstu(string n, bool g, int s, int id)
{
this->name = n;
this->gender = g;
this->score = s;
this->number = id;
return;
}
};
其中包含了四个成员变量 name、gender、score 和 number。函数
student() 和 ~student() 分别是构造函数和析构函数(下文解释)。除此以外,我们还定义了一个成员函数 setstu(),用来初始化成员变量(当然也可以写在构造函数中)。
访问修饰符
我们在上文中定义类时提到了访问修饰符的概念。访问修饰符用以表示段落内成员的可访问状态,分为public
private
和protected
三类。通常一个段落是指当前访问修饰符到下一个访问修饰符之间的所有成员。如果没有定义当前段落的访问修饰符,则当前段落的默认可访问状态为private
。
- public
即“公共的”,表示代码内所有函数均可调用段落内的成员。 - private
即“私有的”,表示除了友元函数(下文解释)和同类型的类对象,其他外部函数均不可调用这个段落内的成员(也就是说类的成员函数是可以调用它们的)。 - protected
即“受保护的”,这一段落内的内容除了具有private
的特性之外,开放了派生类对该段落内容的访问权限(派生类和继承的相关知识,将会在其他文章叙述,更新后补充链接)。
访问修饰符同时用在派生类的定义中。
以下是一个实例:
class box
{
private:
int priV;
protected:
int proV;
};
class smallbox : public box
{
public:
void setpriV(int inp)
{
this->priV = inp;//错误,priV包含在private段内,无权访问
return;
}
void setproV(int inp)
{
this->proV = inp;//OK,proV包含在protected段内,派生类可以访问
return;
}
};
int main()
{
smallbox B;
B.setpriV(5);//error
B.setproV(5);//ok
return 0;
}
构造函数与析构函数
C++中的类提供构造函数和析构函数。构造函数的名称和类名称相同,而析构函数名称只需要在类名称前加上~
即可。需要注意的是在大多数编译器下(如VS2019),构造函数和析构函数是被禁止带有返回值的,也不能具有返回值类型。您只需要声明这些函数即可,当然构造函数和析构函数可以带有参数,也可以定义和重载这些函数。
以下是一个实例:
class myclass
{
private:
int para;
public:
myclass() {};//默认构造函数(一定不能缺少)
myclass(int inp)
{
this->para = inp;
}//用户自定义的构造函数
~myclass() {};//默认析构函数(可选,但建议加上声明)
};
成员函数的定义
类中的成员函数可以在类中定义,也可以在类外部定义。以下分别是成员函数在类内定义和在类外定义的框架,并且他们是等价的:
类内定义成员函数:
class classname
{
private:
var_type variable;
public:
classname() {};//默认构造函数
func_type functionname(para_type param)
{
function body;
}
};
类外定义成员函数:
class classname
{
private:
var_type variable;
public:
classname() {};//默认构造函数
func_type functionname(para_type)//在类外定义成员函数需要在类内部声明
};
func_type classname::functionname(para_type param)
{
function body;
}
友元函数
友元函数在类外定义,而在类内声明,但它不属于任何一个类,这也意味着一个函数可以是多个类的友元。友元函数可以访问类的 private 和 protected 段。请注意:由于友元函数不属于任何一个类,因此友元函数没有 this 指针(this 指针下文解释)。
以下是一个实例:
#include <cstdio>
#include <iostream>
using namespace std;
class Box
{
private:
int V;
public:
friend void print(Box);
void set(int);
};
void Box::set(int V)
{
this->V = V;
}
// 请注意:print()不是任何类的成员函数
void print(Box box)
{
cout << box.V << endl;//可以直接访问Box类的private段成员
}
// 程序的主函数
int main()
{
Box box;
box.set(5);
print(box);
return 0;
}
上面的程序运行后,将会输出以下结果:
5
this指针
C++内置关键字this
返回一个指向当前函数所属的类对象的指针。this 指针在初始化成员变量和调用同一个对象的成员函数中十分实用。
类成员的调用
如果希望调用一个类成员,可以类似结构体使用成员运算符.
。这仅限于运算符之前是类对象名。如果希望通过一个指向类对象的指针访问成员,则需要类似地使用->
。this 指针同样也需要使用->
。
类静态成员
任何一个类中的任何一个成员(包括成员变量和成员函数)都可以通过前置关键字static
被声明为静态的。相同类类型的每一个类对象中的静态的成员共用一个相同的内存,从而静态成员函数没有 this 指针,且静态成员函数只能访问静态的成员。
总结/小注
C++中的类成员变量是可以直接在类中定义时赋初值的。而这种操作在结构体中不被允许。
本蒟蒻的第一篇文章,希望大家多多支持!!!