C++面向对象高级编程(上)-Geekband
头文件和类声明
一定要注意使用防卫式的头文件声明:
#ifndef _CLASSHEAD_
#define _CLASSHEAD_
.
.
.
.
#endif
基于对象和面向对象 :
基于对象 单一Class
面向对象 多个class 之间的关系.
构造函数
inline
默认实参
initialization list 初始列 (在初始列中进行,效率更高)
构造函数重载 overloading
class complex
{
complex (double r =0, double i = 0)
: re (r) , im (i)
{}
complex()
: re(0) , im(0)
{}
private:
double re, im;
};
第二个构造函数是错误的, 因为第一组构造函数已经有初始默认值了,那么第二个就重复设定了.
例如创建对象:
complex c1;
complex c2();
此时就发现,无论是使用第一个构造函数还是第二个构造函数,都是可行的.
所以,第二个构造函数是错的.
当然我们还可以构建其他方式的构造函数.
参数传递与返回值
将构造函数放在private中.
Singleton设计模式
使得本类只有一份实例对象.
在函数后面加const是个好习惯,用于说明该函数内不改变数据
参数传递: pass by value VS pass by reference ( to const)
尽量不要pass by value
传引用其实底层就是传指针.
传引用是4字节, 如果传递是一个字符(单字节) 那还是单字节速度快一些.
传递引用为了控制安全尽量使用const关键字.
如果传递的参数使用reference但并不声明const的,那么也是会被在函数内修改的.
返回值传递: pass by value VS pass by reference ( to const)
尽量return by reference
什么时候不适用reference
1, 当该返回的参数是在函数内定义的局部变量
什么时候适用reference
其他情况全适用
操作符重载与临时对象
—-1 成员函数
+= 双目操作符调用的时候,是调用操作符左边的对象.
return by reference 语法分析
传递者无需知道接收者是以reference形式接收的
(这句话似乎很难吃透, 很值得深刻理解并记住)
—- 2 非成员函数
操作符重载也有可能是全局函数,不一定是类里面的成员函数
你无法同时在类内定义操作符重载又在全局中定义该类的同一个操作符重载
在cout<< …..这样的情况下操作符重载只能是全局操作. 因为左边为ostream的对象os
重载示例:
//实现:
ostream& operator << (ostream& os , const MyClass& my)
{
return os<<my.name<<my.address;
}
//在调用上:
cout<<my;
/*
当只是为了 cout<< c1; 这样的操作, 那么函数可以这样写:
void operator << (ostream& os, const complex& x);
但为了多次操作: cout<<c1<<cout<<c2;那么久必须这样写:
ostream& operator << (ostream& os, const complex& x);
*/
总结:
大气代码:
**1,数据放在private里.
2, 数据传递尽量reference.
3, 数据返回也尽量是reference.
4, 类body中尽量使用const.
5, 构造函数尽量使用初始列
6,操作符重载也有可能是全局函数,不一定是类里面的成员函数**
C++面向对象高级编程(上)-Geekband的更多相关文章
- C++面向对象高级编程(八)模板
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 这节课主要讲模板的使用,之前我们谈到过函数模板与类模板 (C++面向对象高级编程(四)基础篇)这里不再说明 1.成员模板 成员模板:参数为tem ...
- C++面向对象高级编程(六)转换函数与non-explicit one argument ctor
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.conversion function 转换函数 //1.转换函数 //conversion function //只要你认为合理 你可以任 ...
- C++面向对象高级编程(五)类与类之间的关系
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 本节主要介绍一下类与类之间的关系,也就是面向对象编程先介绍两个术语 Object Oriented Programming OOP面向对象编 ...
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
- C++面向对象高级编程(二)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 知识点1.重载成员函数 知识点2 . return by value, return by reference 知识点3 重载非成员函数 ...
- Java面向对象 网络编程 上
Java面向对象 网络编程 上 知识概要: (1)网络模型 (2)网络通讯要素 (3)UDP TCP 概念 (4)Socket (5)UDP TCP 传输 ...
- C++面向对象高级编程(九)Reference与重载operator new和operator delete
摘要: 技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一 Reference 引用:之前提及过,他的主要作用就是取别名,与指针很相似,实现也是基于指针. 1.引用必须有初值,且不能引用nul ...
- C++面向对象高级编程(七)point-like classes和function-like classes
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 1.pointer-like class 类设计成指针那样,可以当做指针来用,指针有两个常用操作符(*和->),所以我们必须重载这两个操作 ...
随机推荐
- Python全栈开发:django网络框架(二)
Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行 ...
- Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)
前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...
- CSIC_716_20191111【函数对象、名称空间、作用域、global 和nonlocal】
函数名是可以被引用,传递的是函数的内存地址.函数名赋值给变量后,只需要在变量后加上括号即可调用函数. 名称空间 内置名称空间:在python解释器中提前定义完的名字 全局名称空间:if.while.f ...
- ubuntu下安装git提示无root权限
apt-get install git 获取git指令 sudo passwd root 重置unix密码 su root 键入密码 参考链接 https://www.cnblogs.com/2she ...
- Spring Cloud失散多年的哥哥Dubbo学习笔记
Spring Cloud失散多年的哥哥Dubbo 随着互联网项目用户量的急剧增长,访问并发良突然暴增,将一个应用使用多个独立的工程共同实现的系统架构,称为SOA系统架构,各个工程可以允许在不同的机器上 ...
- mysql做主从配置
最近想对公司的数据库做个从数据库,除了每天定时备份外,再多出一个同步数据库,双保险,这样也可以用从数据库就行比较耗资源的数据统计. 技术手段最好能记住,然后就是做笔记了,但是每次都查笔记也不好,希望能 ...
- ERROR 1839 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_MODE = ON
从cdb上dump一个库结构,准备与本地结构做对比(可以直接compare,但速度贼慢).使用dump脚本在本地创建的时候报错 -- 导出指定库的结构 shell> mysqldump -hxx ...
- <随便写>同步,异步进程池,线程
from multiprocessing import Pool import time import os def work(n): print("%s run" % os.ge ...
- 面试系列 31 zk都有哪些使用场景
大致来说,zk的使用场景如下,我就举几个简单的,大家能说几个就好了: (1)分布式协调:这个其实是zk很经典的一个用法,简单来说,就好比,你A系统发送个请求到mq,然后B消息消费之后处理了.那A系统如 ...
- java_打印流
public class transientTest { /** * 反序列化操作2 * 序列化后的文件被修改后进行反序列化时会报错 * 决绝方法: * 手动添加序列号Serializable中有声明 ...