文章目录
Tips
- 类的声明(数据成员、成员函数的声明、友元)写在头文件中
- 类是抽象的,不占用内存(静态数据成员例外);对象是具体的,占用存储空间
- 对象所占据的空间只包含数据的内存,成员函数代码不占空间
- public区是对外的接口,函数一般都在public区;这些函数可以直接使用private区的数据类型
- private区一般存放数据类型,只能被同一个类中的成员函数或友员( friend )直接使用,外界不能直接使用
- 成员函数一般在类体内声明,在与头文件同名的源文件中定义,注意定义时加上作用域限定符,如
point::disp()
- 内联函数一般适用于1~5行的,重复使用的简单函数
- 在类体内声明且定义的成员函数自动是内联函数;若要在类体外定义内联函数,必须加inline关键字,且定义的部分要放在与该类的声明所在的同一个文件中。
- 引用对象的成员有三种方法:
p.disp()
成员运算符、通过指针、通过引用 - 对象数组
point p[3];
- 指向对象的指针:下面的例子演示过了;比较麻烦的是指向对象成员的指针。(可以看谭浩强C++ P85)
- 对象和对象之间可以直接赋值和复制:赋值要求被赋值的对象是已经被定义的;而复制可以从无到有,创建一个新对象并且和已有的对象完全相同。
创建类的示例(模板)
//创建一个Point类
//创建数据成员,存储一个三维点的x,y,z坐标,数据类型为double
//创建成员函数,实现点的创建和数据输出
#include <iostream>
#include <string>
using namespace std;
class point{
public: //成员函数都在公有区;成员函数默认是内联函数
point(double a=0, double b=0, double c=0) //构造函数:其名称与类的名称必须完全相同,没有返回类型(void也不行);可以给默认参数
: x (a), y (b), z (c) //初值列(初始化):充分利用
{} //成员函数可直接使用私有数据成员
void point_disp();//在类内部声明函数,将在外部定义
//在类内部声明加定义函数,自动视为内联函数
double findMax(){
double max = (x>=y) ? x : y;
max = (max >= z) ? max : z;
return max;
}
private:
double x, y, z; //数据成员都在私有区
protected: //受保护区:不能被类外函数访问,但可以被派生函数访问
}; //分号不能忘记
//在类外定义函数,记得加作用域运算符;并且是内联函数
//由于在类外定义,必须在定义或声明时加inline关节字,否则不会自动被视为内联函数
inline void point::point_disp(){
cout << "x=" << x << ", y=" << y << ", z=" << z << endl;
}
int main(){
point p1(1.2,5.0,3.0); //用构造函数,创建新的对象
point p2[3];//使用默认参数,构建对象数组
//三种访问成员的方式
//1.通过对象名和成员运算符
p1.point_disp();
p2[0].point_disp();
cout << "The maximum parameter is: "<< p1.findMax() <<endl;
cout << sizeof(point) <<endl; //结果为24,仅仅为3个double的长度,不包含成员函数的长度
//2.通过指针访问
point *p=&p2[1]; //*p为指向point类的指针,初始化为指向对象 p2[1]
//下面两种输出等价
cout << p->findMax() << endl;
cout << (*p).findMax() << endl;
//3.通过引用访问
point &p3 = p1;
cout << p3.findMax() << endl;
return 0;
}
运行结果
x=1.2, y=5, z=3
x=0, y=0, z=0
The maximum parameter is: 5
24
0
0
5
上面的例子把类的声明,成员函数的声明、定义,函数的调用(主函数中)都写在同一个源文件中,看起来十分混乱冗杂,也破坏了C++的封装性和屏蔽性。
好的编程习惯应当是
- 在头文件( .h )中存放声明:类的声明和成员函数声明,以及其余函数的声明
- 在源文件 ( .cpp ) 中存放定义:成员函数定义以及其他函数定义
- 二者共同构成一个类库
- 注意:内联函数的定义必须和类的声明在同一个头文件中,否则在编译时无法置换。