C++的类与对象——类的定义与实现

        面向对象编程(OOP)是C++相对与C的一个重要区别,也是C++的一个主要特性。之前学的到现在已经有一段时间了,平时用的不多,以下特对C++面向对象的相关知识点做整理总结,参考书籍为《C++ Primer》中文第五版。

        重要的OOP特性包括:抽象,封装和数据隐藏,多态,继承,重用性。

        C++中的类:将抽象转换为用户定义类型的C++工具。包括数据本身和操纵数据的方法。类的声明不予详细说明。private和public关键字描述了对类成员的访问控制。public可以被使用者直接访问,private部分成员可以通过public成员函数访问。C++中默认class的成员为private,这是class和struct的一个主要区别。由于隐藏数据是OOP的主要目标之一,一般数据项通常放在private中,组成类接口的成员函数放在public。部分成员函数放在private中用于处理不属于共有接口的实现细节。

       成员函数的实现:类成员可以使用private成员。一般仅在类中对成员函数进行声明,在别的文件中给出实现。这样和类定义中直接实现有所不同,个人经验:除非是频繁访问的,并且程序简短的成员函数可以在类内给出实现或者定义为内联,不然应该在类定义外给出实现。类外函数的实现格式如下(暂时不去讨论构造函数与析构函数):

//成员函数的实现方法:
返回类型 类名::函数名(函数参数...) //::为作用域解析操作符

//内联函数的声明与实现,注意,最好将内联函数的实现放在定义类的头文件中
//声明(在类内):
返回类型 函数名(函数参数...);
//内联函数实现:
inline 返回类型 类名::函数名(函数参数...) 

       需要注意的是:每一个对象都有自己的存储空间,数据是自己的,同一个类的所有对象共享同一组类方法(成员函数),即每个成员函数只有一个副本,同一类不同对象调用相同成员函数实际上是使用同一代码段的。

       类的使用就不介绍了。

       构造函数:因为成员数据多是private属性的,所以需要一个合适的成员函数来初始化它们。这时就要用到构造函数。构造函数无返回值,也不要void,在类的一个实体创建或者new时即调用。对于每一个类当且仅当没有定义任何构造函数时,C++会给它一个默认构造函数(默认调用),默认构造函数不接受任何参数,如果我们不写什么的话,里面什么都不做。我们可以自定义构造函数传入自己想要设置的值。对于构造函数,最好初始化所有的成员数据,指针变量置NULL。值得说明的是,如果需要创建类数组,那么对象必须要有一个默认构造函数。实际上,不带参数,或者允许不传入参数的构造函数就是默认构造函数。

       拷贝构造函数:用于对象的复制,这里和赋值符号“=”要区分。拷贝构造函数依然是构造函数,目的依然是用于类的初始化,可以看成是构造函数的重载,函数参数为同一类的另一个实体。这里会有深拷贝和浅拷贝的问题,当数据成员包含指针类的数据时应该注意。

       析构函数:用于释放内存。当类的生命周期(差不多就是作用域吧)结束时,会自动调用析构函数,或者手动delete一个new出来的对象的时候也会调用析构函数。用于释放内存。注意new出来的成员数据需要在此delete。如果我们不显式定义一个,编译器依然会为我们提供一个默认的析构函数。我们最好手动写一个并delete相关数据,不然会造成内存泄漏。

//先定义一个class mat
class mat
{
    public:
        mat(int m_row=0, int m_col=0);  //构造函数,并给参数赋默认值
        mat(const mat& m_data);          //拷贝构造函数
        ~mat();                         //析构函数,用于释放对象
        ...
    private
        int* data;
        int rows;
        int cols;
}

//构造函数的实现
//值得一提的是,之歌构造函数允许不传入参数,所有的参数都有默认值
//所以这个构造函数也是默认构造函数。
mat::mat(1,2):rows(m_row),cols(m_col) 
{
    if(m_row==0 && m_col==0) data=NULL;
    else data = new int[m_row*m_col];
}

//拷贝构造函数,注意包含指针数据的应该选择深拷贝
mat::mat(const mat& m_data)            
{
    this->rows=m_data.rows;
    this->cols=m_data.cols;
    int data_len=this->rows*this->cols;
    this->data = new int [data_len]
    for(int i=0;i<data_len;++i)
        data[i]=m_data.data[i];
}

//析构函数
~mat()
{
    delete[] data;
}

      this指针:上面的代码已经用到this指针了,可以理解为指向自己的一个指针。可以利用this指针访问本类中的数据,在成员函数中调用本类的另一个成员函数。*this允许你返回该类对象自己。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值