zoukankan      html  css  js  c++  java
  • c++类与对象注意点

    1. 类数据成员定义时不能初始化,比如:

    class a

    {

        int i;

        int j = 1; //错误,不能初始化值

    }

    2. 类的构造函数对自身数据成员包括初始化和赋值,初始化是:i(1),j(1),赋值是在构造函数体内的显示给值,对有类型数据来说二者效果一样,而有些类型数据只能做初始化而不允许赋值。例如:

    class a

    {

        private:

            int i;

            int j;

            const int k;

        public:

            a(int d):i(1),j(2),k(3)

            {

                   // 函数体叫赋值操作而不是初始化,本例中K在这里不再允许赋值

            }

    }

    3. 类和函数一样,可以先声明再定义,未定义之前声明的类叫不完全类型,这种声明叫向前声明。它的含义是表示有这么一个类,但成员及成员类型未知,例如:

    class a; // 声明了一个叫a的不完全类型

    4. 类定义以封号结束,可以在定义类的代码后直接定义类对象并以封号结束例如:

    class a

    {

        //somthing

    } cla,clb;

    表示定义了两个变量名分别为cla,clb的类型为类a的对象;

    5. 非静态类中有个叫 this 的指针指向当前类本身,该指针是 *const 的,意味着不能改变这个指针的指向。

        在类的有返回方法中,如果原形为: const &a funt(){ return *this; } 意味着既不能改变返回的this的指向,也不能改变返回this所指向的成员的数据。

    6. 针对以上出现的问题,可以对返回的this指针对象方法做 const 重载,如:

    class a

    {

        const &a funt() const   { return *this; }; // 这个版本方法的返回类不能修改成员数据

        &a funt() const {return *this; }; // 这个版本方法的返回类可以修改成员数据

    }

    在程序中调用方法时如果返回的类没有修改操作系统会调用const版本,否则调用非const版本

    7. 类一般要定义一个默认构造函数,如果没有默认构造函数有时候会出问题,例如假设类B无默认构造函数(无参的构造函数),在类A的构造函数中又没有显示初始化这时就会处错.

    class A

    {

        B p;

        A(){}; //如果定义A对象就会出错,因为类B没有无参的构造函数

    }

    8. 类通过构造函数一般会做类类型转换,例如类A有接收一个INT类型参数的构造函数则:

    A list[] = {1,2,3}  等价于 A list[] = {A(1),A(2),A(3)}

    也就是可以通过只提供构造函数的参数来转换为具体类对象(只有一个参数的构造函数才能做转换,多个参数的构造函数无法做转换)

    可以通过在构造函数前增加关键字 explicit 来阻止这类转换。

     9. 类可以有静态成员,类的静态数据成员只能在定义体外定义,且定义时需要同时给予初始化。因为静态数据成员不能在构造函数中初始化,c++类也不提供静态构造函数。示例代码如下:

    class A{}

    int A::sti = 2; // 表示对类A的静态int型数据成员sti定义且初始化为2. 

    有一种情况例外,类的静态常量数据成员不可以在定义体外定义和初始化,而必须要要在类定义体内定义及初始化。 class a{ private: static const stj = 2; }

    10. 不同于C#对静态成员只能通过类名称来使用,c++静态成员不但可以通过类名称来使用,也可以通过具体对象来使用。

    11. 有一种特殊情况,对于整值或枚举型的static   const变量,可以直接在类内声明定义。如:
    class   A
    {
    public:
        static   const   int   i   =   3;
        int   p[i];
    };
    这个i就在类内定义给值了,因为下面p变量需要它,但即使这样也需要在类外把它重新定义一下:
    const   int   A::i;
    定义的时候,不要再把初始化的值写上。

  • 相关阅读:
    解决 src/MD2.c:31:20: fatal error: Python.h: No such file or directory安装包错误
    Java 保存对象到文件并恢复 ObjectOutputStream/ObjectInputStream
    Elasticsearch安装配置和测试
    [知识图谱] 环境配置:Java8 + Maven3 + HBase + Titan
    Java8安装配置
    MongoDB 安装、运行、使用、数据恢复
    Java堆空间溢出解决方法 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    服务器重装和配置:Ubuntu16.04 + Anaconda3 + GTX1080驱动 + CUDA8 + cuDNN + 常用工具安装
    [Linux] 输出文件的指定行
    [Linux] sed命令使用之在文件中快速删除/增加指定行
  • 原文地址:https://www.cnblogs.com/kingcat/p/2320709.html
Copyright © 2011-2022 走看看