C++_基础_类和对象3
内容:
(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的更多相关文章
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
- C++_基础_类和对象
内容: (1)引用 (2)类型转换 (3)C++社区给C程序员的建议 (4)面向对象编程的概念 (5)类和对象 (6)构造函数 (7)初始化列表及其必要性 1.引用1.1 指针和引用的使用说明(1)指 ...
- java基础知识—类和对象
1.对象的特征---类的属性 每个对象的每个属性都有特定的值 对象的操作---类的方法 2.封装 对象同时具有属性和方法两项属性. 对象的属性和方法同时被封装在一起,共同体现事物的特性,二者相辅相成, ...
- ObjectiveC1基础代码——类和对象
// // main.m // ObjectiveC1 // // Created by scjy on 15/10/30. // Copyright © 2015年 lizhipeng. A ...
- C++_基础_继承、多态
内容: (1)子类中的拷贝构造和拷贝赋值 (2)多继承和虚继承 (3)多态的初识 (4)虚析构的特性和使用 (5)多态的底层实现 (6)纯虚函数.抽象类的概念 1.子类中的拷贝构造和拷贝赋值 子类中的 ...
- J2SE基础:1.类和对象基础
什么是对象 在Java语言,全部的人,事物或者模块都是一个对象. 同样的对象具有一些同样的特性. 狗,猫,蛇3个对象(动物的对象) 苹果,梨,桔子3个对象(水果的对象) 什么是类 能够将现实生活中的对 ...
- Java基础-3类和对象声明与创建
一).在1和2中有粗略介绍过类和对象的概念,在这里简单回顾一下: 对象与类:一个实际或者虚拟的物体,这个物体既是我们的对象,这个物体呢又是属于一个分类,如动物类,人类 二).创建对象: 在创建对象的时 ...
- php之基础深入---类与对象篇
1.类的自动加载: spl_autoload_register()函数可以注册任意数量的自动加载器,当使用尚未被定义的类(class)和接口(interface)时自动去加载,这样可以避免includ ...
- Java基础教程——类和对象
视屏讲解:https://www.bilibili.com/video/av48272174 面向过程 VS 面向对象 面向过程:强调步骤. 面向对象:强调对象. 面向对象的特点就是:隐藏具体实现的细 ...
随机推荐
- iOS动画技术笔记
概述 在IOS开发中,实现动画操作的地方有很多,典型的是在视图控制器的segue操作时.在同一个视图控制器类中,加载切换不同的视图时,也需要动画效果,还有一些视图对象有动画效果会更好. 插一句,在IO ...
- java多线程(同步与死锁问题,生产者与消费者问题)
首先我们来看同步与死锁问题: 所谓死锁,就是A拥有banana.B拥有apple. A对B说:你把apple给我.我就把banana给你. B对A说:你把banana给我,我就把apple给你. 可是 ...
- 【邻接表字符串Hash】【HDU1800】Flying to the Mars
题意: 给你N个数字,带前导0,问出现最多的数字个数 思路: 读入,清楚前导0,Hash. 用邻接表字符串Hash有一下几点注意 string,不要memset,否则地址也没了,涉及到stl的东西,少 ...
- sql2008中时间类型问题
DATEDIFF (DD ,@sdate ,getdate() ) eg30 计算从开始日期到今天的天数 datename(weekday,@sdate) eg星期三 查询那一天是星期几 SQL Se ...
- 为SharePoint 2010中的FBA创建自定义登录页面
SharePoint 2010中默认的FBA登录页面非常简单,只提供了一个Asp.Net的Login控件,让用户输入用户名和密码.在大多数情况下,我们需要定制这个页面以满足一些安全需求,比如为登录页面 ...
- Global.asax文件的说明
每个应用程序可以包含一个特殊的目录(/bin)和两个特殊的文件(Web.config和Global.asax) Global.asax文件的使用: 作用:处理应用程序范围内的事件,声明应用程序范围的对 ...
- Struts2配置问题java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
方法一:右键点击项目--->build path-->configure build path-->左侧菜单栏就会看到Deployment Assembly-->右侧点击add ...
- 加密传输SSL协议7_SSL协议概述
SSL(Secure Sockets Layer) SSL的功能,可以在通信的双方中建立一个加密的通信通道 同时还可以确认通信的双方是不是就是其声称的人,防止被钓鱼. SSL在网络协议栈中的位置:可以 ...
- hadoop笔记之Hive的管理(web界面方式)
Hive的管理(二) Hive的管理(二) Web界面方式 端口号9999 启动方式:hive --service hwi 通过浏览器来访问:http://<IP地址>:9999/hwi/ ...
- css3之border-color
-moz-border-top-colors:上边框-moz-border-right-colors:右边框-moz-border-bottom-colors:下边框-moz-border-left- ...