EC++学习笔记(一) 习惯c++
条款01:c++多范式编程语言
条款02:尽量以 const, enum, inline 替换#define
1. 提供类型安全检查
2. 去除函数调用开销
3. 避免宏的二义性
const double pi = 3.1415926;
const std::string authorName("wwwjieo0");
宏函数:所有实参必须加上小括号
#define MAX(x, y) ((x) >= (y) ? (x) : (y))
MAX(++a, b); //a被累加两次
c++ inline函数实现:
template<class T>
inline T max(const T& x, const T& y) {
return (x >= y ? x : y);
}
c语言中的宏仍然是必需品:
#include是必需品,#ifdef和#ifndef扮演 条件编译的角色
条款03:尽可能使用const
const 使编译器实施强制保护
char myname[] = "wwwjieo0";
char* p = myname; //non-const pointer, non-const data
const char* p = myname; //non-const pointer, const data
char* const p = myname; //const pointer, non-const data
const char* const p = myname; //const pointer, const data
STL迭代器的const:
const std::vector<int>::iterator it = vec.begin(); //it为const,永远指向begin
std::vector<int>::const_iterator it = vec.begin(); //it可以改变,但*it(即容器元素)不可改变
const 成员函数:
const 成员函数不可以更改对象任何non-static 成员变量
可以利用 const 成员函数实现其non-const 版本
const Widget& func(int x, int y) const; //已经实现
Widget& func(int x, int y) {
return const_cast<Widget&>(static_cast<const Widget&>(*this).func(x, y));
}
类中的每个non-static 成员函数都有一个隐藏的this参数(第一个参数),这个this指针指向类的实例对象,并且this指针为const pointer
所以 Widget& func(int x, int y) 实际上是 Widget& func(Widget* const this, int x, int y);
而 const 成员版本 Widget& func(int x, int y) const 实际上是 Widget& func(const Widget * const this, int x, int y);
(const int& x)和 (const int x)是重载函数,并不是重复定义
static_cast 将(*this) 加上 const 特性,因为要调用 const 成员函数
const_cast 将 const 成员函数返回值 const Widget& 去除 const 特性,因为要与函数返回值类型相同
注意:不能用non-const 成员函数去实现相应的 const 版本,因为 non-const 函数可能会改变一些值,这不符合 const 函数的要求
条款04:确定对象被使用前已被初始化
永远在使用对象之前先将它初始化:
内置类型:手工初始化,避免未定义行为带来的随机值
自定义类型:确保每一个构造函数都将对象的每一个成员初始化
class Person{
public:
Person(const string& name, const string& address);
private:
string theName;
string theAddress;
int theId;
};
Person::Person(const string& name, const string& address) {
theName = name;
theAddress = address;
theId = ;
}
c++规定,对象的成员变量的初始化动作发生在进入构造函数的函数体之前
所以上面程序中,构造函数内部并不是初始化,而是赋值操作
真正的初始化动作发生在 default 构造函数(编译器自动生成)自动调用之时
构造函数应该使用 成员初始化列表 替换赋值操作
Person::Person(const string& name, const string& address)
:theName(name),
theAddress(address),
theId()
{ }
这种方法效率更高,没有首先调用 default 构造函数,而是在进入构造函数的函数体之前利用 copy构造函数直接初始化
总结:总是使用成员初始值列表,并且在初值中列出所有成员变量
c++初始化次序:base class 更早于 derived class,class 的成员变量总是以其声明次序被初始化
EC++学习笔记(一) 习惯c++的更多相关文章
- EC++学习笔记(二) 构造/析构/赋值
条款05:了解c++默默编写并调用了哪些函数 编译器可以暗自为 class 创建default构造函数,copy构造函数,copy assignment操作和析构函数所有这些函数都是 public 并 ...
- EC++学习笔记(三) 资源管理
条款13:以对象管理资源 资源包括:动态分配内存.文件描述符.网络socket.互斥锁.数据库连接 把资源放进对象内,可以依赖c++的"析构函数自动调用机制"确保资源被释放智能指针 ...
- EC++学习笔记(四) 设计与声明
条款18:让接口容易被正确使用,不易被误用 必须考虑客户可能做出什么样的错误(防御式编程)std:shared_ptr会自动使用它的"每个指针专属的删除器",消除了"cr ...
- EC++学习笔记(五) 实现
条款26:尽可能延后变量定义式的出现时间 尽可能延后变量的定义,知道非得使用该变量的前一刻为止方法A: Widget W; ; i < n; ++i) { W = ... } 方法B: ; i ...
- EC++学习笔记(六) 继承和面向对象设计
条款32:确定你的 public 继承塑模出 is-a 关系 public inheritance 意味着 is-a 关系class Derived 以 public 形式继承 class Base, ...
- SQLServer学习笔记系列1
一.前言 一直自己没有学习做笔记的习惯,所以为了加强自己对知识的深入理解,决定将学习笔记写下来,希望向各位大牛们学习交流! 不当之处请斧正!在此感谢!这边就先从学习Sqlserver写起,自己本身对数 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
随机推荐
- sourcegrid统计报表画法以及EXCEL导出内容代码完全版
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 阿里云apt-get安装包时Err:2 http://mirrors.cloud.aliyuncs.com/ubuntu xenial-security/main amd64 git amd64 1:2.7.4-0ubuntu1.2 404 Not Found
新部署的云服务器出现如下错误: root@iZj6cbjalvhsw0fhndmm5xZ:~# apt-get install git Reading package lists... Done Bu ...
- 关于POST的请求的问题的汇总
1)404 解决方式:检查路径,路由问题 2)500 解决方式:1)首先检查代码 2)检查是否是参数未接收到 3)检查是否Content-Type类型导致的参数未收到 4)区分body-raw跟bod ...
- nodeJS进程管理器pm2
pm2是一个带有负载均衡功能的Node应用的进程管理器.当你要把你的独立代码利用全部的服务器上的所有CPU,并保证进程永远都活着,0秒的重载, PM2是完美的. PM2是开源的基于Nodejs的进程管 ...
- iOS利用UIDocumentInteractionController和Quick Look打开或预览文档
在App的开发过程中,我们避免不了要打开软件中的文件,例如:Excel文件,Word文件,图片文件等不同格式的文件或者想要通过第三方的App来打开这些文件,那么我们就要用到UIDocumentInte ...
- c++:printf和cout那个更好更快些
现在群里在讨论cout和printf那个快的问题,但我个人觉得printf好: 因为:printf对于一些数据大,以及保留小数位,字符……可以显示出明显的优势如“%s %d %c…………” 虽然pri ...
- 【编码】【转发】enca 转换编码
enca用法如下: enca -L zh_CN file 检查文件的编码 enca -L zh_CN -x UTF-8 file 将文件编码转换为"UTF-8"编码 enca -L ...
- linux文本界面../和./的区别
linux文本界面../和./的区别 ../代表的是上一个目录 ./代表的当前目录
- nw335 debian sid x86-64 -- 5 使用xp的驱动
nw335 debian sid x86-64 -- 5 使用xp的驱动
- python常见陷阱
copy to https://pythonguidecn.readthedocs.io/zh/latest/writing/gotchas.html 大多数情况下,Python的目标是成为一门简洁和 ...