码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 类

时间:2016-06-24 00:08:31      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

类的定义

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

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

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

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

 

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

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

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

 

类的成员方法

关于隐形形参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){} //构造函数之初始化列表
    //...
}; //分号!

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

需要注意,

① 初始化的成员变量,在初始化列表中看做相应类型更容易理解。如name("name"),看做string("name")。

    这样做更容易理解后面这个例子:name(8, ‘a‘) --这是直接调用string的构造函数来进行name的初始化!

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

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

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

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

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

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

 

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

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

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

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

 

类对象的声明和定义

以类X为例:

X x;//声明

x=X(); //初始化

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

 

C++ 类

标签:

原文地址:http://www.cnblogs.com/larryzeal/p/5612525.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!