一、类
类在使用前需要定义。类中通常包含该类的构造函数、析构函数、成员变量以及成员方法。
1 定义
类的定义可以使用 class
或者struct
关键字。示例如下
class Student
{
public:
Student();//默认构造
// 带参构造函数
~Student(); // 析构函数
string getname() const; // const表示改函数为只读函数,不会修改任何内部成员
private:
// 成员变量
string name;
int num;
int score;
};
成员函数的定义可以在类内部也可以在外部。当在外部的时候,必须指明它们是在类的作用域中。比如上述代码中的getname()
;
string student::getname(){
return name;
}
关于类的定义有三个访问权限标识:public,private,protected。
- public: 能被任何人访问
- private: 被类成员函数和友元函数访问
- protected: 被成员函数、有缘函数以及子类的成员和友元函数访问
构造函数用于给每个数据成员设置初始值。析构函数是在对象销毁时自动调用
。
2 定义实例–对象
student xf;
3 构造函数
构造函数没有返回值,但可以有多个形参,也可以没有形参。在定义时需要定义名字、形参列表和函数体。
Student::Student(const string& nam, const int& num, const int& s) :name(name), number(num), score(s) {}// 带参构造函数
构造函数同样可以重载以及设置默认参数。
4. 类的成员函数
4.1 成员函数定义
成员函数的定义可以在类内,也可以在类外。在类外定义成员函数的话必须在类内先进性定义
public:
string getname(); //成员函数声明
string Student::getname() {
return name;
}
4.2 成员函数的调用
对象.成员函数名(实参列表)
当创建的对象是以指针的进行访问,需要用到箭头运算符
Student* s = &stu;
std::cout << s->getname() << endl;
或者将对象指针用括号括起来,在使用 . 运算符调用。
(*s)-> getname()
成员函数有一个隐含形参 this, 是指向该类对象的一个指针。当需要将一个类的对象作为整体进行引用而不是引用对象的一个成员时。
this->getname()
(*this).getname()
4.3 常成员函数
对于不需要改变调用对象本身的成员函数时,可以将其设计为常函数。常函数的声明和定义方式是在形参列表的右括号后边加上 const。注意常成员函数声明和定义的形式必须一致。
void printout() const;
4.4 静态成员
static int count;
// 外部初始化成员变量
int Student::count = 0;
静态成员和函数于类相关联,而不是与类的对象相关联。静态成员有一下特点
- 节省内存,是所有对象共有的。对多个对象来说,静态成员只存储一次。
- 静态成员的值对每个对象都一样。但是值是可以更新的,只要对值更新一次,能保证所有对象存取更新后的值。
- 静态成员的名字是在类的作用域
- 使用类的静态成员可以封装,可以私有变量,而成员变量不可以。
静态成员和函数的调用如下:
类名::静态成员/方法
5 友元函数
友元机制运行 类将非公有成员的访问权限开放给指定的函数或者类。声明友元函数以 friend 关键字。友元只是声明了一种关系,可以是一个类,也可以是前面定义的其他类中的成员函数,还可以是普通成员函数。
class Choose
{
public:
Choose();
Choose(const Student& a, const Student& b) :x(a), y(b) {};
bool take();
~Choose();
private:
Student x;
Student y;
};
Choose::Choose(){}
Choose::~Choose(){}
bool Choose::take() {
if (x.name == y.name) {
return 1;
}
else
{
return 0;
}
}
在 Student类中声明友元类:
// 友元类
friend class Choose;
这样 choose中的函数可以访问 student对象的私有变量。
6 操作符重载
操作符重载的函数形式为:
返回类型 operator 操作符{操作数参数列表}