C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性。
类的例子:
class Box{
public:
int length;
int width;
int height;
};
int main(int argc, const char * argv[]) {
Box box1;
}
需要注意的是,私有的成员和受保护的成员不能使用直接成员访问运算符 (.) 来直接访问。
类成员函数
类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。类成员函数是类的一个成员,它可以操作类的任意对象,可以访问对象中的所有成员。
写法1:(在class内定义成员函数)
class Box{
public:
int length;
int width;
int height;
int getVolume(){
return length * width * height;
}
};
int main(int argc, const char * argv[]) {
Box box1;
box1.length = 10;
box1.width = 10;
box1.height = 10;
cout << box1.getVolume() << endl;
}
写法2:(仅在class内声明成员函数,在class外使用::符号定义成员函数)
class Box{
public:
int length;
int width;
int height;
// 成员函数声明
int getVolume();
};
//成员函数定义
int Box::getVolume(){
return length * width * height;
}
int main(int argc, const char * argv[]) {
Box box1;
box1.length = 10;
box1.width = 10;
box1.height = 10;
cout << box1.getVolume() << endl;
}
定义class box的完整代码如下:
class Box{
public:
int length;
int width;
int height;
int getVolume();
void setLength(int l);
void setHeight(int h);
void setWidth(int w);
};
void Box::setWidth(int w){
width = w;
}
void Box::setHeight(int h){
height = h;
}
void Box::setLength(int l){
length = l;
}
int Box::getVolume(){
return length * width * height;
}
int main(int argc, const char * argv[]) {
Box box;
box.setLength(10);
box.setHeight(20);
box.setWidth(15);
cout << box.getVolume() << endl;
}
PS:
::
叫作用域区分符,指明一个函数属于哪个类或一个数据属于哪个类。
::
可以不跟类名,表示全局数据或全局函数(即非成员函数)。
int month;//全局变量
int day;
int year;
void Set(int m,int d,int y)
{
::year=y; //给全局变量赋值,此处可省略
::day=d;
::month=m;
}
Class Tdate
{
public:
void Set(int m,int d,int y) //成员函数
{
::Set(m,d,y); //非成员函数
}
private:
int month;
int day;
int year;
}
类访问修饰符
- 数据封装是面向对象编程的一个重要特点,它防止函数直接访问类类型的内部成员。类成员的访问限制是通过在类主体内部对各个区域标记 public、private、protected 来指定的。关键字 public、private、protected 称为访问修饰符。
- 一个类可以有多个 public、protected 或 private 标记区域。每个标记区域在下一个标记区域开始之前或者在遇到类主体结束右括号之前都是有效的。
- 成员和类的默认访问修饰符是 private。
class Base {
public:
// 公有成员
protected:
// 受保护成员
private:
// 私有成员
};
- 公有成员在程序中类的外部是可访问的。可以不使用任何成员函数来设置和获取公有变量的值。就是说可以在class外直接操作class内的成员变量。
- 私有成员变量或函数在类的外部是不可访问的,甚至是不可查看的。只有类和友元函数可以访问私有成员。私有变量只能通过class中的成员函数来进行操作。
- 保护成员变量或函数与私有成员十分相似,但有一点不同,保护成员在派生类(即子类)中是可访问的。
public与private区别如下:
class Student{
private:
int age;
public:
string name;
void setAge(int a);
int getAge();
};
void Student::setAge(int a){
age = a;
}
int Student::getAge(){
return age;
}
int main(int argc, const char * argv[]) {
Student stu;
stu.name = "Bob";
stu.setAge(24);
cout << stu.name << endl;
cout << stu.getAge() << endl;
}
继承中的特点
有public, protected, private三种继承方式,它们相应地改变了基类成员的访问属性。
1.public 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:public, protected, private
2.protected 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:protected, protected, private
3.private 继承:基类 public 成员,protected 成员,private 成员的访问属性在派生类中分别变成:private, private, private
但无论哪种继承方式,上面两点都没有改变:
1.private 成员只能被本类成员(类内)和友元访问,不能被派生类访问;
2.protected 成员可以被派生类访问。
类的构造函数
类的构造函数是类的一种特殊的成员函数,它会在每次创建类的新对象时执行。
构造函数的名称与类的名称是完全相同的,并且不会返回任何类型,也不会返回 void。构造函数可用于为某些成员变量设置初始值。
不仅成员函数可以用::
定义在class外,构造函数也可以这样定义在class外。
从以上代码可以看出,构造函数可以来初始化成员变量的值,还有另一种写法也可以做到这个功能。
析构函数
就是删除创建的对象的函数。
析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
简单例子:
包含了构造函数和析构函数。
创建对象时调用了构造函数,程序结束时,自动调用了析构函数。析构函数默认存在。