c++ 04
一、this指针
1.
2.应用场景
1)
2)将this指针作为函数的参数。一个对象可以通知另一个对象有关自身的地址。
教师
提问|^
V|答案
学生
交叉类问题:
class B; // 短式声明
class A {
B*/B&
};
class B {
A*/A&
};
class A {
A* m_a;
};
非法:
class B;
class A {
B m_b;
};
class B {
A m_a;
};
sizeof(A) ?
class A {
A m_a;
};
3)通过this指针返回对象的自引用
二、常对象与常函数
常对象:
const A a (...);
const A* p = &a;
const A& r = a;
a、p、r一般通称为常对象。
常函数:拥有常属性的this指针的成员函数。在成员函数的参数表后面加上const关键字。
1.在常函数内部无法修改成员变量的值,除非该变量被mutable关键字修饰。
2.通过常对象只能调用常函数。
3.常属性不同的同型成员函数可以构成重载关系,根据调用对象的常属性进行重载匹配:
常->常
非常->非常
如果没有非常版本,非常对象也可以调用常版本。
三、析构函数
1.基本语法
class 类名 {
~类名 (void) {
...
};
};
析构函数没有参数,不能重载。
2.栈中的对象,当期离开作用域时,析构函数被执行。堆中的对象,由delete运算符调用其析构函数。全局/静态对象,其析构函数当卸载进程时被执行。
3.构造和析构的顺序
构造:基类的构造函数->成员变量的构造函数->构造函数中的代码
析构:析构函数中的代码->成员变量的析构函数->基类的析构函数
4.如果一个类没有定义析构函数,那么系统就会提供一个缺省析构函数,调用类类型成员变量以及基类的析构函数,但是缺省析构函数不负责释放动态分配的资源。
四、拷贝构造和拷贝赋值
1.缺省的拷贝构造函数只能实现浅拷贝,因此会带来对象与其副本之间的指针耦合问题,为了实现深拷贝,就需要自己定义拷贝构造函数,以获得完整意义上的对象副本。
int a, b = 10;
(a = b) = 20;
2.缺省的拷贝赋值只能实现浅拷贝,因此会带来对象与其副本之间的指针耦合问题,为了实现深拷贝,就需要自己定义拷贝赋值,以获得完整意义上的对象副本。
实现步骤:
1)防止自赋值
2)释放原内存
3)分配新内存
4)获得新数据
5)返回自引用
练习:实现一个String类,可以通过C风格的字符串进行构造,支持拷贝构造和拷贝赋值,如果使用了动态内存分配,还需要提供析构函数。此外还要支持获得C风格字符串的接口c_str()
五、静态成员
1.静态成员是属于类的,而非静态成员是属于对象的。
2.静态成员变量的定义和初始化只能在类的外部进行,而不能放在构造函数中。
3.静态成员变量在该类的多个实例对象间共享。
4.访问静态成员可以通过类也可以通过对象,但是访问非静态成员只能通过对象。
5.静态成员函数只能访问静态成员,但是非静态成员函数既可以访问静态成员,也可以访问非静态成员。
6.静态成员函数没有this指针,也没有const属性。
7.静态成员也受访控属性的约束。
class Account {
public:
static void setRate (double rate) {
// ...
m_rate = rate;
}
private:
string m_name;
string m_passwd;
double m_balance;
static double m_rate;
};
Account::setRate (0.05);
c++ 04的更多相关文章
- Python学习--04条件控制与循环结构
Python学习--04条件控制与循环结构 条件控制 在Python程序中,用if语句实现条件控制. 语法格式: if <条件判断1>: <执行1> elif <条件判断 ...
- Ubuntu 14.04中Elasticsearch集群配置
Ubuntu 14.04中Elasticsearch集群配置 前言:本文可用于elasticsearch集群搭建参考.细分为elasticsearch.yml配置和系统配置 达到的目的:各台机器配置成 ...
- win8.1硬盘安装ubuntu14.04双系统
在网上找了很多方法都失败了,原因是大多数方法都是用mbr方式安装的,如grub4dos,easybcd.以至于连自己都怀疑win8能不能用硬盘安装,差点就去买个u盘来安装了,就在打算放弃的时候在ubu ...
- 使用win10远程控制ubuntu16.04
使用win10远程控制ubuntu16.04,网上很多需要安装xfce桌面的.今天介绍一下,不需要安装其他桌面,使用Ubuntu16.04自带桌面,漂亮美观. Ubuntu16.04端: 1.打开终端 ...
- ubuntu14.04下安装node.js
在网上查了下,起初是下载了一个node-v0.12.7-linux-x64.tar.gz,解压在/home/node路径下,然后在/etc/profile中添加如下命令: export NODE_HO ...
- mono3.2和monodevelop4.0在ubuntu12.04上两天的苦战
首先第一步是设置ubuntu server 12.04版更新源,推荐中科大的比较快:deb http://debian.ustc.edu.cn/ubuntu/ precise main multive ...
- Jexus Web Server 完全傻瓜化图文配置教程(基于Ubuntu 12.04.3 64位)[内含Hyper-v 2012虚拟机镜像下载地址]
1. 前言 近日有感许多新朋友想尝试使用Jexus,不过绝大多数都困惑徘徊在Linux如何安装啊,如何编译Mono啊,如何配置Jexus啊...等等基础问题,于是昨日向宇内流云兄提议,不如搞几个配置好 ...
- Ubuntu14.04配置Mono+Jexus
总所周知,ASP.NET是微软公司的一项技术,是一个网站服务端开发的一种技术,它可以在通过HTTP请求文档时再在Web服务器上动态创建它们,就是所谓动态网站开发,它依赖运行于 IIS 之中的程序 .但 ...
- deepsooncms在Ubuntu 14.04上部署教程
deepsooncms在Ubuntu 14.04上部署教程 一.安装mono1.在命令行运行sudo apt-key adv --keyserver keyserver.ubuntu.com --re ...
- 在 Ubuntu 15.04 中使用 ubuntu-make、Eclipse 4.4、Java 8 以及 WTP
Ubuntu 今天发布新版本了 其实昨天(2015-04-23)我就看到了 Ubuntu 发布新版本的新闻,下班后回家的第一件事就是访问 Ubuntu 的官网,很可惜,没有提供下载.今天(2015-0 ...
随机推荐
- 简单拨号器(Android)
感受: 1.了解了intent中的action和Uri. 2.了解了向下一个活动传递数据. 3.了解了内容提供器. 4.了解自定义适配器. 4.其实T9拨号器和简单计算器原理一样.
- SRM 599 DIV1
A 首先发现对于2操作,每种素因子可以单独考虑,然后取出步数最多的计入答案,然后分别加上对每种素因子的1操作; 第二步我犯了个错误,以为最优方案是把素因子指数按二进制操作,在1的位置执行1操作,0的位 ...
- (转)iOS Wow体验 - 第一章 - iOS人机界面设计规范纵览
本文是<iOS Wow Factor:Apps and UX Design Techniques for iPhone and iPad>第一章译文精选,其余章节将陆续放出. 关于本套译文 ...
- ZigBee心电传输(二)
不管怎样,还是在高手的帮助下完成了前面的硬件部分,现在进行ZigBee的心电AD采集和转换.需要把ZigBee重新拾起来. 首先明确下目标和思路吧,目标是将模拟心电信号通过AD转换,变为数字信号,再用 ...
- Linux内核设计基础(十)之内核开发与总结
(1)Linux层次结构: (2)Linux内核组成: 主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET)和进程间通信(IPC)等5个子系统组成. (3)与Un ...
- grub2手动引导ubuntu
測试机OS为ubuntu 14.04.1 LTS x86_64 磁盘分区情况为: Filesystem 1K-blocks Used Available Use% Mounted on ...
- SQL函数简述
数字函数ABS 取绝对值 POWER 乘方 LN 10为底数取幂SQRT 平方根 EXP e的n次乘方 LOG(m,n) m为底数n取幂数学运算函数:ACOS ATAN ATAN2 COS COSH ...
- java基础之代理
代理的定义,代理的应用,代理的特性
- asp.net的3个经典范例(ASP.NET Starter Kit ,Duwamish,NET Pet Shop)学习资料
asp.net的3个经典范例(ASP.NET Starter Kit ,Duwamish,NET Pet Shop)学习资料 NET Pet Shop .NET Pet Shop是一个电子商务的实例, ...
- JAVA与JSON的序列化、反序列化
package com.linkage.app.memcache; import java.util.HashMap;import java.util.Map.Entry; import net.sf ...