内容:

(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. mongodb use db show dbs

    mongodb 常用命令: 在dbs间切换用 use xxxdb 之后再操作就是只针对 xxxdb了: show dbs显示全部数据库 show collections 显示全部集合 mongodb数 ...

  2. poj3267--The Cow Lexicon(dp:字符串组合)

    The Cow Lexicon Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8211   Accepted: 3864 D ...

  3. BZOJ 1024 SCOI 2009 生日快乐 深搜

    题目大意:有一块蛋糕,长为X,宽为Y.如今有n个人来分这块蛋糕,还要保证每一个人分的蛋糕的面积相等.求一种分法,使得全部的蛋糕的长边与短边的比值的最大值最小. 思路:刚拿到这个题并没有什么思路.可是定 ...

  4. android的Log日志打印管理工具类(一)

    android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...

  5. 解决windows下Eclipse连接远程Hadoop报错

    Exception in thread "main" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.N ...

  6. @property和@synthesize

    main.m #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, cons ...

  7. js实现睡眠

    //js暂停函数 function Pause(obj, iMinSecond) { if (window.eventList == null) window.eventList = new Arra ...

  8. 将 子集和问题 运行时间从 200.8s 优化到 0.4s

    在过去24小时里,一直被这题折腾着... 题目: A Math gameTime Limit: 2000/1000MS (Java/Others) Memory Limit: 256000/12800 ...

  9. Android SQLite系列

    转:http://blog.csdn.net/liuhe688/article/details/6715983 Android中如何使用SQLite. 现在的主流移动设备像Android.iPhone ...

  10. Ajax与C#应用详细实例

    实现刷新的方法主要是Ajax,本文档实现Ajax有两个方法(Jquery 和 W3C的JS方法):其次,使用JS也可以实现刷新数据不刷新页面(详见其他刷新页面方法JS实现):对于CallbackRef ...