内容:

(1)析构函数
(2)拷贝构造和拷贝赋值
(3)静态成员
(4)成员指针
(5)输入输出运算符重载

1.析构函数
当一个对象被创建时,自动调用构造函数进行初始化
当一个对象被销毁时,自动调用析构函数进行资源的回收

1.1 格式
class 类名
{
~类名(void)
{
//析构函数体;
}
};
针对构造函数和析构函数 叫做构造器和析构器

注意:
对于全局变量/局部变量/块变量,当生命周期结束时自动调用析构函数;而对于堆区的对象来说,当delete时会自动调用析构函数

1.2 缺省析构函数
(1)对于未定义析构函数的类,系统会自动提供一个缺省析构函数,该析构函数会调用成员以及基类的析构函数
(2)对于动态分配的资源,必须通过自定义析构函数进行释放,当然所释放的资源不仅仅包括动态内存,还包括文件的关闭,socket的关闭等等

2.拷贝构造和拷贝赋值运算符
2.1 拷贝构造函数
(1)语法格式
class 类名
{
类名(const 类名& 变量名)
{
拷贝构造函数体;
}
};

(2)调用拷贝构造的一般形式
Student{};
Student s;
Student s2(s); //调用拷贝构造
Student s3 = s; //同上
Student* ps = new Student (s);//同上

注意:
(1)类中没有自定义拷贝构造函数时,系统自动提供一个缺省拷贝构造函数
(2)缺省拷贝构造函数就是按照字节复制一份和拷贝源一模一样的副本
(3)缺省拷贝构造函数的拷贝方式往往不能实现对象间的深拷贝,这时就需要自定义拷贝构造函数,以获得真正意义上的副本
(4)拷贝构造函数的调用时机
a.用同类型的对象初始化
b.函数调用传递对象型参数
c.函数返回对象(受编译器影响)

2.2 拷贝赋值运算符函数
如:
Student s;
Student s2;
s2 = s; //进行拷贝赋值
=> s2.operator=(s);

(1)格式
Student& operator=(const Student& s)
{
//拷贝运算符函数体,实现赋值
//1.释放原来的内存
//2.申请新内存拷贝数据
//3.防止自赋值
//4.返回自引用,支持连续=
return *this;
}

注意:
(1)如果类中没有自定义拷贝赋值运算符函数,则系统自动提供一个缺省拷贝赋值运算符函数,本质就是按照字节进行复制
(2)缺省拷贝赋值运算符函数往往不能实现深赋值,需要自定义赋值运算符函数,以获得真正意义上的副本

3.静态成员
static修饰局部变量:生命周期变长
static修饰全局变量:防止其他文件
使用
static修饰函数:防止其他文件使用
static修饰成员:该成员属于整个类,而不是单一的对象

3.1 静态成员变量
(1)
格式
class 类名
{
static 数据类型 静态成员变量名;
};
(2)注意
a.静态成员变量必须在类的外部单独定义,格式:
数据类型 类名::静态成员变量名
= 初始值;

b.静态成员变量的存储形式与全局变量一样,所不同的是受到作用域和访控属性的影响

c.静态成员属于整个类,也就是在所有对象间共享,既可以通过类名去访问,也可以通过对象名去访问;而非静态成员变量属于具体的对象

d.对类进行sizeof计算时,不包括静态成员变量的大小

3.2 静态成员函数
(1)格式
class 类名
{
static 返回值类型 函数名(形 参表)
{
函数体;
}
};

(2)注意
a.对于静态成员函数来说,只能访问静态成员,不能访问非静态成员;对于非静态成员函数来说,既可以访问非静态成员,也可以访问静态成员
b.没有this指针,没有常属性

思考:
要求自定义一个类,这个类有且只能有创建一个对象.

4.成员指针
如:
Student{};
Student s;
string* ps
= &s.m_name;//普通指针

4.1 指向成员变量的指针
(1)定义形式
数据类型 类名::*指针变量名;
(2)初始化/赋值
指针变量名 = &类名::成员变量名;
(3)使用(解引用)
对象.*指针变量名;
对象指针->*指针变量名;

4.2 指向成员函数的指针
(1)定义
返回值类型 (类名::*指针名)(形参 表);
(2)赋值/初始化
指针名 = &类名::成员函数名;
(3)使用(解引用)
(对象.*指针名)(实参表);
(对象指针->*指针名)(实参表);

注意:
对于指向静态成员函数的指针不需要加类名::的限定

///////////////////////////////////////////////////////////////////////

1.析构函数

  -类为什么要使用函数要进行类的相关操作?像构造、析构、拷贝??

  -使用析构需要注意什么?

2.拷贝构造

  -格式

  -什么时候需要用到

  -深拷贝和浅拷贝

3.拷贝赋值

  -格式

  -什么时候需要用到?

4.static  

  -为什么要有static?

  -static 修改变量、参数、返回值、函数时的特殊性?

  -多试试,熟悉static的特性

5.其他

  -

C++_基础_类和对象3的更多相关文章

  1. 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结

    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...

  2. C++_基础_类和对象

    内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...

  3. java基础知识—类和对象

    1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...

  4. ObjectiveC1基础代码——类和对象

    // //  main.m //  ObjectiveC1 // //  Created by scjy on 15/10/30. //  Copyright © 2015年 lizhipeng. A ...

  5. C++_基础_继承、多态

    内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...

  6. J2SE基础:1.类和对象基础

    什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...

  7. Java基础-3类和对象声明与创建

    一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...

  8. php之基础深入---类与对象篇

    1.类的自动加载: spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,这样可以避免includ ...

  9. Java基础教程——类和对象

    视屏讲解:https://www.bilibili.com/video/av48272174 面向过程 VS 面向对象 面向过程:强调步骤. 面向对象:强调对象. 面向对象的特点就是:隐藏具体实现的细 ...

随机推荐

  1. Redis简介以及如何在Windows上安装Redis

    Redis简介 Redis是一个速度非常快的非关系型内存数据库. Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erla ...

  2. sql server操作2:查询数据库语句大全【转】

    注:以下操作均建立在上篇文章sql Server操作1的数据基础之上 一.实验目的 熟悉SQL语句的基本使用方法,学习如何编写SQL语句来实现查询 二.实验内容和要求 使用SQL查询分析器查询数据,练 ...

  3. 怎样解决xcode里开发cocos2dx改动lua脚本后不刷新的问题

    用xcode来开发cocos2dx,结果发现一个非常纠结的问题,假设我一旦改动了一个Lua文件,我必须clean之后再build,否则改动的Lua文件不会体现出来.这是一个非常令纠结的结果,特别是我要 ...

  4. Android dump .so 文件crash log

    众所周知,在android系统上,有时候我们遇到so文件的crash仅仅能打log,可是非常多时候并不知道crash在什么地方,幸运的是crash后,一般能够产生一个.dmp文件. 我们能够依据这个文 ...

  5. IIS的安装

    xp上好像只能装IIS5,IIS6根本就装不了

  6. js 小练习之indexOf

    闲来无事~ 写点小练习 function zz(arr, item) { var a=arr.join("") var b=a.indexOf(item) alert(b) } z ...

  7. Sizzle之tokenize

    在Sizzle里,大体思路,当为复合选择器时,判断是否支持querySeletorAll,如果不支持则调用自写方法select. select的功能十分冗长,下面先分析tokenize 在tokeni ...

  8. 自定义Toast样式-两行文本居中显示

    toast可以设置自定义的view和显示位置.下面是一个简单的例子,复杂些的就是改变其布局文件就可以了. /** * @author BMR * @ClassName: ToastWithTwoTex ...

  9. C#:判断一个String是否为数字

    方案一:Try...Catch(执行效率不高)private bool IsNumberic(string oText){          try         {                 ...

  10. window.open() 使用详解

    Window_Open详解    引:Window_Open详解一.window.open()支持环境:JavaScript1.0+/JScript1.0+/Nav2+/IE3+/Opera3+ 二. ...