类(Class)是一个模型,当我们创建实例的时候,也就是对象本身。可以理解成,类是一个设计蓝图,决定了一个对象将是什么样的(具备什么样的功能,属性)而对象是类的一个实例化。
OOP过程(面向对象的过程)的第一步是先创建一个类,而每个类跟变量一样都有一个名字,所以我们就从如何声明一个类开始说起:
class Mynote{
};
//分号不要忘记 可以联想到结构体的声明 虽然很类似 但差别还是很大 结构体内部只声明变量 而类里面是变量和函数
这就创建了一个类,虽然什么也干不了,但他是一个成功的开始!!
注意:
- 类名的第一个字母采用大写是一种习惯的标准,但不是硬性规定。如果非小写那也没办法
- 在类的声明末尾有一个分号,这一点就跟C语言里的结构体很相似了
类由变量和函数组成,类的实例化对象将使用那些变量来存储信息,调用那些函数来完成某些操作。(在类里面常会看到一些专门的术语:类里的变量叫做属性,函数称为方法,本质都是一样的)
例子:先声明一辆车的一些简单属性,例如颜色,引擎,油量,轮子个数等等,
class Car{
public:
std::string color;
std::string engine;
float gas_tank;
unsigned int wheel;
};
//public 在后面的笔记中会有
现在为类定义一些方法,其实也就是定义一些函数,创建个人函数也是两个步骤的过程:先创建函数的原型(声明),再描述该函数本身实现的过程。 给类添加方法如出一辙:
-先在类的声明里创建一个方法的原型
-稍后再实现这个方法
class Car{
public:
std::string color;
std::string engine;
float gas_tank;
unsigned int wheel;
void fill_tank(float liter);
//方法的声明:方法是“加油”,参数是“公升”
void running(void);
};
现在我们的Car类有了一个名为fill_tank的方法,他只有一个输入参数,不需要任何的返回值。但是我们只有他的原型(声明),要想使用它,我们还需要对这个函数进行正式的定义(告诉系统如何去实现它),方法的定义通常安排在类声明的后面。
#include<iostream>
class Car{
public:
std::string color;
std::string engine;
float gas_tank;
unsigned int wheel;
void fill_tank(float liter);
//方法的生命:方法是“加油”,参数是“公升”
void running(void);
};
void Car::fill_tank(float liter){//::是作用域解析符 说明fill_tank 是属于Car这个类的 例如std::cout的使用 说明cout是属于std的
gas_tank += liter;
}
int main(){
return 0;
}
我们发觉作用域解析符(::),作用是告诉编译器这个方法存在于何处,或者说是属于哪一个类。例如前面讲过namespace的用法,其实namespace是一个偷懒的方法,不提倡使用,因为命名是有作用域区分的,如果一开始就将命名空间定为std,那么以后所有的命名都是在std里了。
针对以上说的这些可以进一步将这个类进行扩展,就不赘述了
面向对象编程技术(object-oriented programming)可以说是面向过程技术(producedural programming)的替代品。面向对象技术关注的是对数据进行怎样的处理,面向过程技术关注的是对数据进行处理的过程。
C++允许在类里声明常量,但不允许对他进行赋值。
class Car{
public:
const float TANKSIZE = 85;//出错
};
绕开这一限制的方法就是创建一个静态常量,但不常用
class Car{
public:
static const float FULL_GAS = 85;
};
类似于结构的情况,可以在声明某各类的同时创建一些该类的对象,这种做法在C++里是允许的,但是作为一种良好的编程习惯,应该避免这种做法,一般不把类的声明和定义写在一起。
class Car{
//.....各种声明
}car1,car2;
最后假设有以下代码:是把一个对象赋值给另一个同类的对象将会自动使他们同名的属性有同样的值。
Car car1,car2;
car1.setColor("WHITE");
//.......对car1对象进行各种操作
car2 = car1;