内容:

(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. 共享参数ContentProvider 类与数据库绑定,如何通过共享参数测试类,测试数据库的增删改查功能

    Intent可以传一个对象 当两个界面之间跳转时,需要传递一个对象过去,是通过使用Bundle类,并且实体类需要serializable实现序列化,传递方法如下: 定义一个静态常量作为key值 pub ...

  2. C#格式化成小数

    datagridview某列格式化成两位小数 ............................................................................. ...

  3. DQL

    DQL(Data QueryLanguage) 基本格式 select * from 表名 对于列进行限制 格式一:取指定列 select 列1,列2 from 表名 格式二:为列起别名的三种表示法, ...

  4. mysql distinct&group by 应用

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的 ...

  5. input模糊搜索功能

    <!doctype html> <meta charset="utf-8"> <style type="text/css"> ...

  6. Windows vista以上模拟Alt Ctrl Delete

    之前客户要求我们能够在windows登陆界面能够用指定账户批量控制机器登陆,然后用windows credentials provider(vista以上,xp需要用Gina)实现了这个功能,这期间遇 ...

  7. JVM学习之JVM1.6 GC详解

    转自:http://www.cnblogs.com/ggjucheng/p/3977384.html,多谢分享 前言  JVM GC是JVM的内存回收算法,调整JVM GC(Garbage Colle ...

  8. 使用ajax异步提交表单

    虽然这篇文章的标题是提交表单,但是主要的难点在于使用ajax提交文本域的内容, 在工作中的经常会需要ajax跨域的问题,通常的需求使用jsonp就可以得到解决,但是当前项目中有一个图片服务器,客户端需 ...

  9. Struts2中ModelDriven的使用

    它是Struts2种独有的一种接收用户输入的机制,想在项目中使用模型驱动 (ModelDriven)需要让Action实现com.opensymphony.xwork2.ModelDriven 接口, ...

  10. firefox 自写扩展改版,总结

    自己写的扩展,油猴功能,进一步改进,增加了许多操作.原来只是在13以下版本下面能用,主要是在13版本下面chrome代码和page下面代码能够直接互调,13版本以后就不可以了,最近考虑到新版Firef ...