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 ...
随机推荐
- Git 2.7: 一个新的带来许多新特性和性能提升的主要版本
在2.6版本发布两个月之后,Git 2.7发布.该版本带来了许多新特性以及性能的提升. 本文选取了Git 2.7带来的主要变化: git remote支持get-url子命令,可以显示指定远端的URL ...
- c++之命名空间namespace
1命名空间解决全局变量的冲突 main.h文件 #pragma once // data命名空间的名称 namespace data { ;//外部全局变量冲突 } main.cpp #include ...
- Java中BigDecimal的8种舍入模式是怎样的
Java中BigDecimal的8种舍入模式是怎样的?下面长沙欧柏泰克软件学院和大家一起来学习下吧: java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecima ...
- WebService-调用第三方提供的webService服务
互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...
- 由mysql数据库基础上的php程序实现单词的查询、删除、更改和查询
我做了一个php程序,将表单数据添加到数据库,借用mysql扩展库函数实现对mysql数据库的操作,能够实现添加单词.删除单词.更新和查询单词.运行环境是普通的mysql数据库和php.Apache服 ...
- 在Unity中使用Shader
1.Material 和 Shader 的关系.一个材质包括一个Shader程序.在Shader中设置的属性能够通过Material可视化设置 2.内建Shader,在5.0之后的版本号中大部分旧的S ...
- WAS集群系列(6):集群搭建:步骤4:安装WAS升级软件
逐步点击"下一步",注意一处流程,例如以下列举: "升级软件"安装的路径设置,建议与之前的WAS及IHS安装的绝对路径同样,例如以下所看到的: 逐步点击,完毕安 ...
- Oracle SQL ANY和ALL语句
Oracle的嵌套子查询可以使用Some,Any和All对子查询中返回的多行结果进行处理. Some表示满足其中一个的含义,是用or串起来的比较从句. 例如:SELECT * FROM emp WHE ...
- WinForm窗体设置
属性: 软件启动后在屏幕中间 StartPosition = CenterScreen取消放大按钮 MaximizeBox = false不能拖动边框 FormBorderStyle = FixedD ...
- Javascript基础引用类型之Object
虽然说ECMAScript也是一门对象语言,但是它和其他面向对象语言还是有区别的,它不具有类和接口等基本结构.所以在ECMAScript中一般说类指的是引用类型.创建Object实例的方式有两种: 第 ...