IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++代码优化~effective c++总结 10.12 -> 正文阅读

[C++知识库]c++代码优化~effective c++总结 10.12

?一、习惯c++

1.尽量使用const,enum,inline替换#define

在学习c的过程中我们经常用#define来进行预处理操作,但#define并未被视作语言的一部分,因此也会带来许多的问题。

? #define i? 5?

在这条预处理命令中i被定义为5,但是在编译过程中所有的i都被替换为5,可能会导致i并没有进入符号表中。当你使用这个常量进行编译报错时,并不会提示i出错。而是会提到5这个数字。

如果对记号表不太理解可以看一下这篇文章

https://www.cnblogs.com/programnote/p/4729467.html

但是在使用const定义时并不会出现这种问题,因为你的i已经被保存在符号表。

当我们以常量替换#define时需要注意

1.定义常量指针时,因为常量定义需要放在头文件中以便被其他的源码所使用。

所以我们需要把指针声明为const。对于在 * 左右表示的不同含义在下文中会有所提及。

这里给出一个例子:

const char* const name=“jam”;

但是在c++中我们已经学了string,所以用string替换会达到更好的效果

const std::string name("jam");

2.定义类的专属常量

我们在定义class的专属常量时需要将常量的作用域限制在class内,但是#define不能用来定义class的专属常量,也不能提供任何的封装性。?

?我们知道enum也可以用来定义常量,但是enum的行为比较像define而不像const,因为我们可以取得一个const的地址,而不能取得enum和#define的地址。如果你不想让一个指针来指向你的某个整数常量,那么你可以试试enum;同时enum和#define一样不会导致非必要的内存分配。


?使用#define来实现宏时虽然不会带来函数调用的额外开销,但会带来许多麻烦

例如

#define? MAX(A,B) (A) > (B) ? (A) : (B)

只是看着这些括号就让人很不舒服吧。

如果不加括号会带来更多的麻烦

例如:

#define? ADD(a)? a+a

当两个add相乘时结果会是多么糟糕。

当我们使用template inline函数时

template<typename T>

inline void max(const T&a,const T&b)

{

f(a > b ? a : b );//函数内函数调用的实现,再次不多解释
}

这样我们就不用担心参数核算的问题了,另外max也是真正的函数遵循作用域和访问规则。

总结:1.对于单纯的常量,最好用const对象或enums替换;

? ? ? ? ?2.对于形似函数的宏,最好用inline函数替换。?

二、尽可能使用const

const用于告诉编译器某个值保持不变,可以修饰class外部的global 或namespace中的常量,或者修饰文件、函数中的static对象。

const出现在*左边表示被指物是常量,出现在*右边表示指针自身是常量。

vector<int>v;

const std::vector<int>::iterator iter=v.begin();

*iter=10;//没问题改变的是iter所指物

++iter;//错误iter是const;

const在函数声明时的应用:

令函数返回一个常量,往往可以降低因客户错误导致的意外。

这里写一段简洁的代码看一下

class ans{};

const ans operator*(const ans&lhs,const ans& rhs);

ans a b c;

if(a*b=c);//实际想做比较操作

我们在使用const作为返回值时,如果出现这种无意义的赋值操作就会报错(一般情况不会报错,使得许多人很苦恼)

在继续const的使用说明前希望大家可以看一下这篇文章了解bitwise const和logical const

http://blog.sina.com.cn/s/blog_477141850101hooy.html

当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。但是切记不可一用const版本调用non-const版本,因为const成员函数承诺绝不改变其对象的逻辑状态。

例如

class text

{

public:

const char& operator[](std::size_t position)const

{

...

return text[position]

}

char& operator[](std::size_t position)

{

...

return text[position]

}

private:

std::string t;

}

当两个函数的功能一样时,可能会调用两次,这样会造成编译时间,代码膨胀等问题。

c++四种cast用法

我们可以这么修改代码

class text{
public:
const char& operator[](std::size_t position) const
{
...;
return text[position];
}
char& operator[](std::size_t position)
{
...;
return 
const_cast<char&>(
static_cast<const text&>(*this)[position];
};

转型(cast)大家可以点击上面链接查找资料。

如果不转型为const那么non-const函数只会无穷的递归调用自己,注意我们写的是操作符重载函数,将非const对象转型为了const对象,这样我们就避免了代码重复。

总结:

1.将某些东西声明为const可以帮厨编译器侦测出错误用法。

2.const可以被施加于任何作用域内的对象、函数、函数参数、函数返回类型。

3.当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可以避免代码重复。但是切记不可一用const版本调用non-const版本,因为const成员函数承诺绝不改变其对象的逻辑状态。

三、最后保证所有对象使用前都已被初始化?

这个方面就不多解释了,直接总结一下吧

1.为内置型对象进行手工初始化,因为c++不保证初始化他们。

2.构造函数最好使用成员初值列,而不要再构造函数本体内使用赋值操作。初值列列出的成员变量,排列次序应该与class中的声明次序相同。

例如:

class text{
public:

text();

int myid;

string myname;

}

text::text(const std::int&id,const string& name):myid(id),myname(name)

{};

最好使用local static对象替换 non-local static对象。免除“跨编译单元的初始化次序”问题。

?本篇文章的主要参考书籍是《effective c++》,用更短的篇幅来让大家获得相同的知识,同时也是我在学习《effective c++》时所做的一些总结,希望能帮到大家。同时我也会陆续将本书中的9个模块全部更新完,喜欢的小伙伴们就关注一下我吧。希望在学习c++的路上能有更多的小伙伴

?

?

?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-14 22:21:18  更:2021-10-14 22:21:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:57:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码