一、对象初始化

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成员函数,负责就没有对外的接口,无法对对象进行操作。

C++ 类、对象、class的更多相关文章

  1. C++ 类对象和 指针的区别

    C++ 类对象和 指针的区别 C++ 类对象和 指针的区别 转自:http://blog.csdn.net/ym19860303/article/details/8557746 指针的情况 class ...

  2. Android 通过 Intent 传递类对象或list对象

    (转:http://www.cnblogs.com/shaocm/archive/2013/01/08/2851248.html) Android中Intent传递类对象提供了两种方式一种是 通过实现 ...

  3. NSLog(@"%@",类对象); 默认输出类名

    NSLog()函数输出Objective-c对象时,输出的是该对象的description方法的返回值.也就是说,以下两行代码作用完全一样(假设p是指向任何对象的指针变量). NSLog(@" ...

  4. WPF整理-XAML构建后台类对象

    1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的.其实不然! "Actually, XAML has nothing to do with UI. It's mer ...

  5. class中new与未new的区别 类对象占用空间--转载

    转载自http://blog.sina.com.cn/shuiwuhendeboke    颗颗的博客 (1)作用域不同 不用new:作用域限制在定义类对象的方法中,当方法结束时,类对象也被系统释放了 ...

  6. 规则引擎集成接口(九)Java类对象

    Java类对象 右键点击“对象库” —“添加java类对象”,如下图: 弹出窗体,在文本框中输入类的全名“com.flagleader.test.Test”,选择该类型后确定,如下: 显示如下,勾选上 ...

  7. 1,SFDC 开发篇 - 类对象和SOQL查询

    1,类对象 & 接口 & 属性   2, Object & SOQL    

  8. 福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

    我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型 ...

  9. Python的高级特性8:你真的了解类,对象,实例,方法吗

    Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

  10. Effective Objective-C 2.0 — 第14条:理解“类对象“的用意

    每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系. 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知. 尽量使用类型信息查询方 ...

随机推荐

  1. (19)javaWeb项目名称修改

    1,选中项目,[右键]-[Refactor]-[Rename] 在弹出面板中,填写New Name 点击[OK] 2,改变运行时目录名称 选中项目[右键]-[Properties] 在弹框中选择选择[ ...

  2. Linux设备驱动--块设备(二)之相关结构体

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  3. Get started with Sourcetree

    Understand the interface Bookmarks window From that window, select the Local or Remote buttons to vi ...

  4. ubuntu搭建Gerrit代码审核服务器

    谷歌的 Android 开源项目在 Git 的使用上有两个重要的创新,一个是为多版本库协同而引入的 repo,另外一个重要的创新就是 Gerrit —— 代码审核服务器.Gerrit 为 git 引入 ...

  5. Swift4 基本数据类型(范围型, Stride型, 数组, 字符串, 哈希表)

    创建: 2018/02/28 完成: 2018/03/04 更新: 2018/05/03 给主要标题加上英语, 方便页内搜索 [任务表]TODO 范围型(Range)与Stride型  与范围运算符相 ...

  6. 转载别人的ognl

    一.循环遍历集合 1.在jsp中引入标准函数声明<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix=" ...

  7. Luogu P1122最大子树和 【水树形Dp】By cellur925

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  8. 【SpringCloud构建微服务系列】学习断路器Hystrix

    一.Hystrix简介 在微服务架构中经常包括多个服务层,比如A为B提供服务,B为C和D提供服务,如果A出故障了就会导致B也不可用,最终导致C和D也不可用,这就形成了雪崩效应. 所以为了应对这种情况, ...

  9. 超级实用的VSCode插件,帮你大幅提高工作效率

    Visual Studio Code是一个轻量级但功能强大的源代码编辑器,可在桌面上运行,适用于Windows,macOS和Linux. 它内置了对JavaScript,TypeScript和Node ...

  10. git 文件回滚

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file.场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第 ...