定义一个类
struct Sales_data{
std::string isbn()const ;
Sales_data& combine(const Sales_data&);
std::string bookNo;
unsigned units_sold=0;
double revenue=0.0;
}
1、成员函数
成员函数的声明必须在类的内部,它的定义既可以在类的内部,也可以在外部,定义在内部的函数是隐式的inline函数,在外部定义需要使用作用域运算符::。
1.1、const 成员函数
string fun() const{};
在参数列表后的const关键字的作用是修改隐式this指针的类型,上面的例子中,this的类型是Sales_data * const,意为着我们不能把this绑定到一个常量对象上,因此,我们不能在一个常量对象上调用成员函数isbn()。如果使用了const成员函数,this就会变成const Sales_data * const类型 了,this可以指向常量对象,isbin函数体内不能改变this所指的对象。而combine函数不需要const,因为常量对象不能使用这个函数,这个函数的对象会改变自身的内容。
在类的外部定义congst成员函数的话也必须在参数列表后明确指定const属性,同时指定它所属的类名:
std::string Sales_data::isbin()const{
return bookNo;
}
1.2、构造函数
构造函数的任务是初始化类对象的数据成员,无论何时只要类的 对象被创建,就会执行构造函数。
- 构造函数名与类名相同
- 没有返回类型
- 可以重载
- 不能声明成const
(1)合成的默认构造函数
如果我们没有为类显式的定义构造函数,编译器会为我们隐式的定义一个默认构造函数(又叫做合成的默认构造函数),这个构造函数按照下面规则初始化类的数据成员:
1.如果有类内初始值,用它来初始化成员(比如上面的units_sold=0,revenue=0.0)。
2.否则,默认初始化(如bookNo被初始化为空字符串)。
2、this指针
成员函数通过一个名为this的隐式参数来调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象的地址来初始化this指针。因此任何自定义名为this的参数或变量的行为都是违法的,我们也可以在函数内部使用this。
string fun(){return this->no;}
this是一个常量指针,不允许改变this中保存的地址。
2.1、返回this对象
在函数中使用*this来解引用得到执行该函数的对象:
return *this;
3、类的作用域
类本身就是一个作用域,类的成员函数的定义也是嵌套在类的作用域之中的,所以,即使成员函数在外部定义也可以使用类的成员变量。
编译器分两步处理类:首先编译成员函数的声明,然后才轮到成员函数体。一次呢,成员函数体可以随意使用勒种的其他成员而无须在意这些成员出现的顺序。