一、对象初始化

1.不能在类声明中对数据成员初始化,因为类只是一个抽象类型,不占存储空间,无处容纳数据。

2.若某类的数据成员都是public,则可以像结构体一样初始化,如

Time t={12,21,04};

若数据成员有private或protected则不能这样初始化。

3.构造函数没有返回值,不需要用户调用,也无法被用户调用。

4.带参数的构造函数初始化格式:类名 对象名(实参1,实参2...)

5.构造函数的参数初始化列表格式:

类名::构造函数名(若干参数):初始化表{}

Student ::stu(x,y):stuNum(x),name(y){}

6.在类内声明构造函数时就可以指定默认参数,如

Box(int h=10,int w=10,int l=10)或Box()

默认构造函数要么无参,要么指定全部参数,一个类只能有一个默认构造函数,若定义了全参默认构造函数,则不能再重载构造函数,应该在声明构造函数时指定默认值,不能在定义时指定,若构造函数的全部参数都指定了默认值,则创建对象是可以给出任意个实参,也可以不给。

7.this指针指向对象,它的值是当前被调用的成员函数所在的对象的起始地址。

二、析构函数

1.用new动态创建对象,delete时会调用析构函数。析构函数只能有一个,用来执行“用户希望在最后一次使用对象之后所执行的任何操作”。

2.先构造的对象后析构,相当于栈。

三、对象数组

1.若构造函数只有一个参数,则可进行如下定义:Student stu[3]={5,8,12},三个参数分别给三个构造函数;

2.若构造函数不止一个参数,则亦可用上述方式定义,其中三个参数分别称为三个构造函数的第一个参数,但最好不要用上述方式来定义,因为会歧义(在vs2015中直接连编译都没通过)。应该用如下方式来定义:

Student stu[3]={Student(1,2,3),Student(11,12,13),Student(21,22,23)};

四、对象指针

1.指向普通函数的指针:

假设现有一函数

int haha(int i,char c)
{
    //xxxxxxx
}

要通过指针来调用该函数,则先声明指针:

int (*p)(int i, char c);

再让指针指向函数:
p = haha或者p = &haha也行;

即可通过指针调用函数了,如:
(*p)(1, 'w');

2.指向成员函数的指针:

与普通指针函数相比,声明指针要加上类限制:int(Student::*p)(int i, char c);

定义指针也得加上类限制:p = &Student::haha,而且&不可省略。

用指针调用函数时必须通过对象:(stu.*p)(1, 'w');

五、共用数据保护

1.常对象:Time const t(1,2,3);或const Time t(1,2,3);定义时必须初始化,然后数据成员无法被修改。常对象只能调用常成员函数。

2.常成员函数:函数声明时最后要加上const,如:void haha()const;

常成员函数可以访问对象中数据成员,但不能修改。

3.若一定要修改常对象的某个数据成员,应该用关键字mutable,如:mutable int count;也只能通过常成员函数来修改。

4.常数据成员:只能通过构造函数的参数初始化表来初始化,并不能被更改。

六、对象动态建立、释放

1.一般的对象空间都不能随时释放,比如Student stu这样的,只能是在函数调用结束之类的时候被动释放。

2.new、delete就可以随时开辟、撤销空间,所以称为动态的。

七、静态成员

1.静态数据成员:是一个类的成员而不是某个对象的成员,一个类的所有对象都可以引用这个成员,是共用的,值都是一样的,如果改变值,则对所有对象来说这个值都会变,这样比较节省空间。即使不定义对象,也可以引用类的静态数据成员(用类名),也可以通过对象引用。不能用构造函数来初始化,只能在类外初始化。

如,static int a;

2.静态成员函数:性质和静态数据成员一样。调用一个对象的普通成员函数后,会将该对象的首地址赋给this指针,但静态成员函数没有this指针,不能访问非静态数据成员,只能访问静态数据成员。如果指定了对象,其实也是可以访问非静态数据成员的,但是一般不建议这么用。

如static int add();

八、类模板

1.有时多个类的功能相同,仅仅是数据类型不同,为了省去重复工作的麻烦,就可以用模板类。类模板是类的抽象,类是类模板的实例。

2.成员函数定义在类定义内:

template <class haha>//haha为数据类型

class hehe//hehe不是类名,是类模板名

{

private:

haha x;

haha y;

public:

hehe(haha a,haha b)

{

x=a;

y=b;

}

haha max()

{

return (x>y)?x:y;

}

}

使用时:hehe <int> hh(4,5);//此处int代替了上面的haha

3.成员函数定义在类定义外:则应该

template <class haha>//haha为数据类型

haha hehe<haha>:: max()

{

return (x>y)?x:y;

}

九、其他特性

1.c++是基于过程和面向对象的混合型语言。基于过程的程序主要是面对函数,只要设计一个个函数就行了。面向对象的程序主要是类,函数基本都在类内,所以主要是设计类。

2.基于过程的程序=算法+数据结构;

面向对象的程序=对象+消息=算法+数据结构+消息

3.定义类时一般先public后private。

4.c++也可以用struct关键字来定义类,与class唯一的区别就是struct默认为private。不推荐用struct。

5.在类定义内定义的成员函数,若不包括循环等结构,c++系统会自动将其作为inline函数。类外定义的成员函数就没有这个待遇了,必须要写上inline关键字才能成为内联函数。

6.函数的声明和定义只要有一个inline关键字就够了。

7.sizeof一个类时,返回值是这个类中数据成员的大小,跟成员函数无关,若没有数据成员则返回1。

8.一个类至少有一个public成员函数,负责就没有对外的接口,无法对对象进行操作。

最新文章

  1. spark 官方文档(1)——提交应用程序
  2. ABAP 将单元格设置编辑状态 FORM
  3. [转载]盒模型display:-webkit-box;的使用
  4. php7 编译安装 apache
  5. 五、Spring ——单元测试
  6. subString用法,字符串保持一定位数,不足补0
  7. cotex_m3内核提供的ITM串口打印调试
  8. Keyboard Test Utility v1.0.1.0 电脑键盘测试软件绿色版
  9. Hadoop 中 最重要的两个模块
  10. 【js 实践】js 实现木桶布局
  11. 在Ubuntu16.04.4上安装jdk
  12. awk:快速入门(简单实用19例+鸟哥书内容)
  13. “System.FormatException”类型的未经处理的异常在 System.IdentityModel.dll 中发生 其他信息: 十六进制字符串格式无效。
  14. vue + ts @Prop boolean 问题
  15. 通用 正则表达式 C# (.NET)Regex 总结
  16. 21、bootstrap框架
  17. SVN安装后,右键不显示SVN菜单项
  18. canvas移动端常用技巧图片loading
  19. Oracle 学习之触发器
  20. Windows Server2008安装mysql5.6出现程序无法正常启动(0xc000007b)

热门文章

  1. 反爬统计 数据库 sql CASE
  2. js来获取所有屏幕适配的总结
  3. ABAP WEBRFC
  4. iOS SHA加密算法的实现
  5. AOP 基本术语及其在 Spring 中的实现
  6. debian webmin 安装
  7. OpenMediaVault 系统安装问题
  8. robot设置chrome mobile emulation
  9. form的一个特性
  10. win10下的jdk1.8安装