类
C++ 在 C 的基础上增加了面向对象编程 OOP,支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型,用于指定对象的形式,包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类被称为类的成员。
类定义
定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是说,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。
类定义是以关键字 class 开头,后跟类的名称。类的主体是包含在一对花括号中。类定义后必须跟着一个分号或一个声明列表。例如,我们使用关键字 class 定义 Student 数据类型,如下所示:
class Student
{
public:
int age; //年龄
string name; //姓名
double chinese; //语文分数
double math; //数学分数
double english; //英语分数
double sum; //总分
};
关键字 public 确定了类成员的访问属性。在类对象作用域内,公共成员在类的外部是可访问的。您也可以指定类的成员为 private 或 protected。
定义对象
对象是根据类来创建的。声明类的对象,就像声明基本类型的变量一样。下面的语句声明了类 Student 的两个对象:
Student s1; //声明s1,类型为Student
Student s2; //声明s2,类型为Student
注意
对象 s1 和 s2 都有它们各自的数据成员。
访问数据成员
类的对象的公共数据成员可以使用直接成员访问运算符 . 来访问。
访问数据成员 示例代码
#include<bits/stdc++.h>
using namespace std;
class Student
{
public:
int age; //年龄
string name; //姓名
double chinese; //语文分数
double math; //数学分数
double english; //英语分数
double sum; //总分
};
int main()
{
Student s1,s2;
s1.name = "Tom";
s1.age = 10;
s1.chinese = 98;
s1.math = 99;
s1.english = 100;
s1.sum = s1.chinese + s1.math + s1.english;
cout << "s1.name:" << s1.name << endl;
cout << "s1.age:" << s1.age << endl;
cout << "s1.chinese:" << s1.chinese << endl;
cout << "s1.math:" << s1.math << endl;
cout << "s1.english:" << s1.english << endl;
cout << "s1.sum:" << s1.sum << endl;
return 0;
}
运行结果:
s1.name:Tom
s1.age:10
s1.chinese:98
s1.math:99
s1.english:100
s1.sum:297
警告
私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问。
类成员函数
类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。
对应我们刚刚定义的类 Student,现在我们使用成员函数来访问类的成员,而不是直接访问这些类的成员:
class Student
{
public:
int age; //年龄
string name; //姓名
double chinese; //语文分数
double math; //数学分数
double english; //英语分数
double sum; //总分
double getSum(void); //返回总分
};
- 成员函数可以定义在类定义内部,你可以按照下面的方式定义 getSum() 函数
class Student
{
public:
int age; //年龄
string name; //姓名
double chinese; //语文分数
double math; //数学分数
double english; //英语分数
double getSum(void) //返回总分
{
return chinese + math + english;
}
};
- 你也可以在类的外部使用范围解析运算符 :: 定义该函数,如下所示:
double Student::getSum(void) //返回总分
{
retuen chinese + math + english;
}
警告
需要强调一点,在 :: 运算符之前必须使用类名。调用成员函数是在对象上使用点运算符 .
实例 示例代码
#include<bits/stdc++.h>
using namespace std;
class Student
{
public:
int age; //年龄
string name; //姓名
double chinese; //语文分数
double math; //数学分数
double english; //英语分数
double getSum(void) //返回总分
{
return chinese + math + english;
}
};
int main()
{
Student s1,s2;
s1.name = "Tom";
s1.age = 10;
s1.chinese = 98;
s1.math = 99;
s1.english = 100;
cout << "s1.getSum() : " << s1.getSum() << endl;
return 0;
}
运行结果:
s1.getSum() : 297
类访问修饰符
数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。成员和类的默认访问修饰符是 private。
class Student {
public:
// 公有成员
protected:
// 受保护成员
private:
// 私有成员
};
公有成员(public)
公有成员在程序中类的外部是可访问的。您可以不使用任何成员函数来设置和获取公有变量的值,如下所示:
public 示例代码
#include<bits/stdc++.h>
using namespace std;
class Student
{
public:
int age; //年龄
string name; //姓名
double chinese; //语文分数
double math; //数学分数
double english; //英语分数
double sum; //总分
};
int main()
{
Student s1,s2;
s1.name = "Tom";
s1.age = 10;
s1.chinese = 98;
s1.math = 99;
s1.english = 100;
s1.sum = s1.chinese + s1.math + s1.english;
cout << "s1.name:" << s1.name << endl;
cout << "s1.age:" << s1.age << endl;
cout << "s1.chinese:" << s1.chinese << endl;
cout << "s1.math:" << s1.math << endl;
cout << "s1.english:" << s1.english << endl;
cout << "s1.sum:" << s1.sum << endl;
return 0;
}
运行结果:
s1.name:Tom
s1.age:10
s1.chinese:98
s1.math:99
s1.english:100
s1.sum:297
私有成员(private)
protected 成员(受保护)
继承中的特点
有 public, protected, private 三种继承方式,它们相应地改变了基类成员的访问属性。
public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private
private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private
但无论哪种继承方式,上面两点都没有改变:
1.private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
2.protected 成员可以被派生类访问。