• C++ 类


    类的定义

    使用class或struct定义,区别在于前者默认private,后者则是public。

    需要注意的是,类定义后面有分号!!!

    原因是C++支持类定义后面跟上变量列表--即用于定义类变量!

    但是,极其不赞成这样做(类定义后面跟着变量列表)。

    如果试图定义一个类的对象,那必须先定义类!--如果是声明,那类对象也只能声明。声明是不占存储空间的!

    由于必须先定义类,所以类内部无法使用其本身类型定义的对象!

    但是,由于类头本身就是声明,所以可以使用类的指针或者引用

    20160627补充:类的static成员可以是类类型!!!

    类的成员方法

    关于隐形形参this,见之前的文章。

    需要注意的是,

    在普通的非 const 成员函数中,this 的类型是一个指向类类型的 const 指针。--不能修改指针!
    在 const 成员函数中,this 的类型是一个指向 const 类类型对象的 const 指针。--既不能改变 this 所指向的对象, 也不能改变 this 所保存的地址。

    ① 类的const成员只能调用const成员。
    ② const成员函数可以重载非const成员函数。
    ③ 根据指针形参是否指向const对象也可以重载函数。
    ④ 非 const 对象可以使用任一成员,但非 const 版本是一个更好的匹配
    --所以,我们可以重载类中的const成员函数。

    类的成员方法,必须在内部声明,但定义则内外皆可。区别在于,内部定义的,默认inline。

    类的构造函数

    需要注意的是初始化列表,无论有没有显式的初始化列表,成员数据都会初始化!显式初始化或隐式初始化!初始化不是赋值!

    class X{
        private:
            string name;
            int age;
        public:
            X():name("name"),age(18){} //构造函数之初始化列表
        //...
    }; //分号!

    上面示例的构造函数及其初始化列表。

    需要注意,

    ① 初始化的成员变量,应该连起来更容易理解。如string name和name("name"),连起来就是string name("name")。

        这样做更容易理解后面这个例子:name(8, 'a') !

    ② 如果初始化列表中没有涵盖全部成员变量,那会以隐式方式进行初始化。

    ③ 初始化列表中的顺序与初始化顺序无关,初始化顺序就是变量定义的顺序!

    ④ 构造函数也可以重载,也可以有默认实参!

        需要注意的是,如果给全部的形参提供默认实参,那相当于有多个无参构造!构造不会报错,但创建无参对象会异常。

    ⑤ 如果没有提供构造函数,默认会生成一个无参构造函数。

        但是,只要有一个显式的构造函数,就不会生成!

    另外,初始化列表和构造体赋值是两回事,初始化在构造体之前!

    由于初始化总会进行,所以:

    ① 使用构造体进行赋值效率较低,因为还是先初始化了,再覆盖。

    ② const对象和引用对象必须初始化!如果赋值则会错误!

    类对象的声明和定义

    以类X为例:

    X x;//声明

    x=X(); //初始化

    class X y; //C的格式,C++可以去掉class。

    其他:前向声明只能用于声明指针或引用的情况

  • 相关阅读:

    泛型
    特性
    2.Linux基础入门
    1.Linux介绍及系统安装
    php十七种设计模式适用场合总结
    转载zendframework 插件方式
    常用的Jquery代码片段,没事的时候研究一下
    Zend Framework1.9 模块化搭建
    PHP的设计模式总结命令链模式
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5612525.html
Copyright © 2020-2023  润新知