备忘:C++ 类 (初学之实录)。

声明类的一般形式:

class 类名 [:基类1[,基类2]]

{

private :

私有的数据和成员函数;

protected

保护的数据和成员函数;

public :

公用的数据和成员函数;

};

private: 私有的。仅类内可见。子类及外部都不见。

public: 公共的。类外也可见。

protected: 受保护的。类及派生的子类可见。

使用类时注意的小问题:

使用类时,类在声明时,会直接创建类的实体。如果不想在声明时创建,一般使用指针方式声明类。如:

?


1

2

3

4

5

CTest A(x, y);  // 声明时直接创建了 A类,并执行A的构造函数 CTest(x, y);

CTest *B; // 先声明一个类的指针    

B = new CTest(x, y); // 在需要时,再创建类的实体。

delete B; // 释放 B 的实体。如不执行delete释放。*B所指向的实体会一直存在。

// 注意: A不用释放,他会在作用域结束时,自动释放,也就是函数执行完后。会自动释放A。

 

构造函数

  1. 类的构造函数与类同名。
  2. 无参构造函数在类对象进入其作用域时调用构造函数。即类被创建时,调用构造函数。
  3. 构造函数没有返回值,因此也不需要在定义构造函数时声明类型,这是它和一般函数的一个重要的不同之点。
  4. 默认无参构造函数不需用户调用,也不能被用户调用。
  5. 在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句。但是一般不提倡在构造函数中加入与初始化无关的内容,以保持程序的清晰。
  6. 尽管在一个类中可以包含多个构造函数,但是对于每一个对象来说,建立对象时只执行其中一个构造函数,并非每个构造函数都被执行。
  7. 如果用户自己没有定义构造函数,则C++系统会自动生成一个构造函数,只是这个构造函数的函数体是空的,也没有参数,不执行初始化操作。
  8. 派生类的构造函数不会继承父类的构造函数。需要显式执行。执行方法是在派生类的构造函数后加冒号:加父类的构造函数(可带参数)

    如:

?


1

2

3

4

5

6

7

class CTest1: CTest{

public:

  CTest1(int x, int y):CTest(x) //CTest()是 CTest1的父类的构造函数, 假设其有参数。

{

   ….. //语句。

};

}

释构函数

  1. 类的释造函数与类同名,并在前面加上~。
  2. 当类对象的生命期结束时,会自动执行析构函数。

具体地说如果出现以下几种情况,程序就会执行析构函数:

  1. 如果在一个函数中定义了一个对象(它是自动局部对象),当这个函数被调用结束时,对象应该释放,在对象释放前自动执行析构函数。
  2. static局部对象在函数调用结束时对象并不释放,因此也不调用析构函数,只在main函数结束或调用exit函数结束程序时,才调用static局部对象的析构函数。
  3. 如果定义了一个全局对象,则在程序的流程离开其作用域时(如main函数结束或调用exit函数) 时,调用该全局对象的析构函数。
  4. 如果用new运算符动态地建立了一个对象,当用delete运算符释放该对象时,先调用该对象的析构函数。
  5. 析构函数不返回任何值,没有函数类型,也没有函数参数。因此它不能被重载。一个类可以有多个构造函数,但只能有一个析构函数。
  6. 析构函数的作用并不是删除对象,而是在对象被册除(释放)时被调用的一个过程,以便在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。
  7. 派生类是不能继承基类的析构函数的,也需要通过派生类的析构函数去调用基类的析构函数。

构造与释构函数执行顺序:

类在创建时:先依次执行上一父类的构造函数,再执行当前类构造函数。即类本身的构造函数是最后执行的。

基类构造-->父1构造-->…….-->最近的父类构造-->本类(当前类)构造

类在释放时:先执行本类释构函数。再依次执行父类的释构函数。如果有多层继承的,最后执行是最基类的释构。

本类(当前类)释构-->最近的父类释构-->…….--> 父1释构-->基类构造

类的函数成员的一些说明:

static静态函数:

在类的函数声明前加上 static关键字。即该函数就成了类的静态函数。他会在程序运行时,就为该函数声明内存。

静态函数,是类本身的函数。直接用类名加作用域符::就可以调用,如: CTest::myFunc();

不需在类的实创建后才能调用。这跟类的一般函数不同。他也可以在类的实体创建后,像使用一般函数一样使用,如 A.myFunc();

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

class CTest

{

public:

    static void fn()

    {

        puts("TEST");

    }

    static void fn(int x) // 像普通函数一样, 虚函数可重载。

    {

        cout << "TEST:" << x << endl;

    }

};

void main()

{

    CTest::fn(); // 直接引用静态函数

    CTest::fn(100);

    CTest A; // 类的实体

    A.fn(); // 实体引用静态函数

    A.fn(200);

}

调用父类虚函数

调用父类的虚函数,在派生类作用域中可以用:this-><类名>::<函数名>();或 :: <类名>::<函数名>();在实体中可以用实例名加成员符 (.)或(->)<类名>::<函数名>

如示例:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

class CFather

{

public:

    virtual void Say() // 父类的虚拟函数

    {

        puts("father say");

    }

};

class CChild : public CFather

{

public:

    void Say() // 函数被重载

    {

        ::CFather::Say(); //也可写成 this->CFather::Say();

        puts("Child say");

    }

};

int _tmain(int argc, _TCHAR* argv[])

{

    CChild C;

    

    C.Say();

    C.CFather::Say(); //实体引用父类虚函数

    system("pause");

}

纯虚函数

纯虚函数是在声明虚函数时被“初始化”为0的函数。声明纯虚函数的一般形式是

virtual 函数类型 函数名 (参数表列) = 0;

如:

?


1

2

3

4

5

6

7

class CTest

{

public:

    CTest(); // 构造函数

protected:

    virtual float myFunc( )const =0;  //纯虚函数

}

纯虚函数只有函数的名字而不具备函数的功能,不能被调用。它只是通知编译系统:“在这里声明一个虚函数,留待派生类中定义”。在派生类中对此函数提供定义后,它才能具备函数的功能,可被调用。纯虚函数只是了实现多态性。

关于纯虚函数需要注意的几点:

    1. 纯虚函数没有函数体;
    2. 最后面的“=0”并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”;
    3. 这是一个声明语句,最后应有分号。
时间: 2024-08-29 20:03:54

备忘:C++ 类 (初学之实录)。的相关文章

VS2008 Lua 编程环境搭建(初学备忘)

在VS 2008 中,导入 lua.h 之类的头文件后,编译含有Lua函数的时候,可能会出现如下错误: 1>main.obj : error LNK2019: 无法解析的外部符号_luaL_checkinteger,该符号在函数"int __cdecl add(struct lua_State *)" ([email protected]@[email protected]@@Z) 中被引用 1>main.obj : error LNK2019: 无法解析的外部符号_lua

linux下常用命令备忘

转自:Linux 命令集锦 linux下查看监听端口对应的进程 # lsof -i:9000 # lsof -Pnl +M -i4 如果退格键变成了:"^h". 终端连接unix删除退格键,按住CTL键同时按delete Linux搜索 # find / -name "xxx.conf" 查看linux是32位还是64位的命令 #file /sbin/init #getconf LONG_BIT #getconf -a 在Linux和Windows下都可以用nslo

PHP设计模式之备忘模式

1.Norton Ghost的方便与问题 我们大多数win的用户都用过Norton Ghost,只要将目前系统备份一下生成镜像文件,等系统中毒或崩溃的时候,用Norton Ghost恢复一下就回到备份时候的样子了. 这个可以说就是备忘(Memento)模式的基本原理了,先备份,需要的时候恢复.因此备忘模式是比较好理解的. 但在实际应用中,如何正确的应用备忘模式,是需要注意的. 难道我们在word写文章的时候,先要Ghost备份一下所有的硬盘,一旦文章写错了,需要恢复,就用Ghost覆盖硬盘? 就

Colletion View 简单的备忘

UIColletionView 这篇只是做UIColletionView的常用属性.代理方法和数据源方法的备忘,之后做一些自定义布局,增加删除动画等. UIColletionViewFlowLayout的常用属性和UIColletionView的常用属性方法 // 创建布局类 let layout = UICollectionViewFlowLayout() layout.itemSize = CGSizeMake(50.0, 50.0) layout.headerReferenceSize =

P2.JS之触碰材质(ContactMaterial)备忘

关键代码: 1 boxShape.material = new p2.Material(); 2 platformShape.material = new p2.Material(); 3 4 var material = new p2.ContactMaterial(boxShape.material, platformShape.material, { 5 surfaceVelocity: -50, 6 restitution: 0.5, 7 friction: 0.3, 8 stiffne

代码整洁备忘(一)

无聊在看<代码整洁之道>,找到了一些自己以前没有注意的地方,在这里记录下来,备忘一下. 目前看完了第九章. 1.重复很多的代码是不好的,需要仔细考虑去掉无用的重复. 2.变量,函数,类等的命名要足够精确,精简&易于搜索. 3.函数尽可能的少用参数(3个以内),&不要向函数内传递bool,因为这明确的说明了这个函数干的不是一件事!函数的职责应该是单一的.函数应该尽可能的短小,过长的函数是不好的. 4.注释,能不用就不用,能少用就少用.能用好的名字说明的问题就不要用注释来说明.标记

备忘:CSS术语词汇表——张鑫旭

一.叨点什么 写文章的时候经常用到一些CSS方面的专业词汇.但是毕竟芳华年少不在,脑袋有点秀逗了,很多名词都记不住,这种感觉比厕所便秘还难受.比如今天居然记不起来公司公认脸蛋最pp的同事的名字,没想到我会记不住美女的名字.我觉得我背后一阵萧瑟的秋风吹起,自己俨然成了漫画里面的程序猿—— 某天闲逛到nimbupani,发现有专门展示CSS术语的文章,哇咔咔,感觉好像咬到一口正宗的高邮咸鸭蛋一样,不过人家的是英文,所以我还要本地化润饰处理,然后,就可以留给自己备忘的哈,的说. 二.CSS词汇我来也

正则表达式入门及备忘

概述 正则表达式,主要是用符号描述了一类特定的文本(模式).而正则表达式引擎则负责在给定的字符串中,查找到这一特定的文本. 本文主要是列出常用的正则表达式符号,加以归类说明.本文仅仅是快速理解了正则表达式相关元字符,作一个备忘,供以后理解更复杂表达式的参考,以后关于正则表达式的相关内容会持续更新本文.示例语言用C# 概述 普通字符 字符集合 速记的字符集合 指定重复次数的字符 匹配位置字符 分支替换字符 匹配特殊字符 组,反向引用,非捕获组 贪婪与非贪婪 回溯与非回溯 正向预搜索.反向预搜索 最

Objective-C教程备忘单

终极版本的Objective-C教程备忘单帮助你进行iOS开发. 想开始创建你的第一个iOS应用程序么?那么看一下这篇很棒的教程吧:Create your first iOS 7 Hello World Application 注:这篇文章我写了三天,可能在一些必要的地方使用了编辑和说明,所以如果有任何疑问和修改建议请在下方评论. 这不是一个初学者指南,也不是关于Objective-C的详细讨论,这是关于常见的和高水平的论题的快速索引. 如果这里有些问题没有涉及到,你也可以查阅以下文章: Obj