C/C++学习笔记:类 (Class)和对象 (Object)

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 ) 中存放定义:成员函数定义以及其他函数定义
  • 二者共同构成一个类库
  • 注意:内联函数的定义必须和类的声明在同一个头文件中,否则在编译时无法置换。

例子参见
ROS/C++ 创建自己的类库(头文件和源文件)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值