effective c++ 条款2

这篇具有很好参考价值的文章主要介绍了effective c++ 条款2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

尽量用const,enum,inline替换#define

effective c++ 条款2,effective c++,c++,开发语言
总结就是:
effective c++ 条款2,effective c++,c++,开发语言

常量(const)替换宏(#define)

// uppercase names are usually for macros
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;

指针常量

双const:指针不能变(只能指向这一块内存空间),指向的内存单元的值也不能变。

	std::cout << "测试常量指针" << std::endl;
	const char* const authorName1 = "StevePro Studios";   //c类型字符串 char*   
	std::cout << *(authorName1 + 0) << *(authorName1 + 1) << std::endl;
	char* const authorName12 = "StevePro Studios2";
	authorName12[2] = 'x';  //指针只能指向S的地址(值可变)  authorName12[2] =nullptr;不可修改
	const char* authorName13 = "StevePro Studios3";
	authorName13 = nullptr; //指针可以指向其他内存空间,但内存空间中的值不能变。  authorName13[2] = 'x';不可修改

或者可以使用string常量代替:

	std::cout << "string常量" << std::endl;
	const std::string authorName2("StevePro Studios");    //c类型字符串 string

effective c++ 条款2,effective c++,c++,开发语言

类成员常量

  1. 类的静态成员
  2. 在头文件声明,在cpp文件中定义

effective c++ 条款2,effective c++,c++,开发语言
effective c++ 条款2,effective c++,c++,开发语言
这样也就完成了常量的定义。

	std::cout << GamePlayer1::NumTurns << std::endl;
	GamePlayer2 g2;
	std::cout << g2.scores << std::endl;

可以在其他函数中,直接调用常量GamePlayer1::NumTurns。
effective c++ 条款2,effective c++,c++,开发语言

枚举(enum)替换宏(#define)

effective c++ 条款2,effective c++,c++,开发语言
effective c++ 条款2,effective c++,c++,开发语言

也可以在其他函数中直接使用常量:

	GamePlayer2 g3;
	std::cout << g3.NumTurns << std::endl;

模板函数(template inline)替换宏函数

#include <iostream>

#include "GamePlayer1.h"
#include "GamePlayer2.h"
// uppercase names are usually for macros
#define ASPECT_RATIO 1.653
const double AspectRatio = 1.653;


int f(int parm) {
	std::cout << parm << std::endl;
	return parm;
}

#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))



// We don't know what T is so pass by reference-to-const	Item20
template<typename T>
inline void callWithMax(const T& a, const T& b)
{
	f(a > b ? a : b);
}


int main()
{
	std::cout << "测试常量指针" << std::endl;
	const char* const authorName1 = "StevePro Studios";   //c类型字符串 char*   
	//std::cout << *(authorName1 + 0) << *(authorName1 + 1) << std::endl;
	//char* const authorName12 = "StevePro Studios2";
	//authorName12[2] = 'x';  //指针只能指向S的地址(值可变)  authorName12[2] =nullptr;不可修改
	//const char* authorName13 = "StevePro Studios3";
	//authorName13 = nullptr; //指针可以指向其他内存空间,但内存空间中的值不能变。  authorName13[2] = 'x';不可修改

	std::cout << "string常量" << std::endl;
	const std::string authorName2("StevePro Studios");    //c类型字符串 string

	std::cout << "测类中的静态常量" << std::endl;
	std::cout << GamePlayer1::NumTurns << std::endl;
	GamePlayer2 g2;
	std::cout << g2.scores << std::endl;

	std::cout << "测类中的枚举" << std::endl;
	GamePlayer2 g3;
	std::cout << g3.NumTurns << std::endl;

	std::cout << "测试#define CALL_WITH_MAX(a,b) f((a)>(b)?(a):(b))" << std::endl;
	int a = 5; int b = 2;
	CALL_WITH_MAX(++a, b);  std::cout << "a的值最后为: " << a << std::endl;
	a = 5; b = 2;
	CALL_WITH_MAX(++a, b + 10);   std::cout << "a的值最后为: " << a << std::endl;
	std::cout << "使用模板后" << std::endl;
	a = 5; b = 2;
	callWithMax(++a, b);
	a = 5; b = 2;
	callWithMax(a, b+10);
	return 0;
}

effective c++ 条款2,effective c++,c++,开发语言
宏函数存在的问题
effective c++ 条款2,effective c++,c++,开发语言

解决办法:
effective c++ 条款2,effective c++,c++,开发语言文章来源地址https://www.toymoban.com/news/detail-607308.html

到了这里,关于effective c++ 条款2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Effective C++条款07——为多态基类声明virtual析构函数(构造/析构/赋值运算)

    有许多种做法可以记录时间,因此,设计一个TimeKeeper base class和一些derived classes 作为不同的计时方法,相当合情合理: 许多客户只想在程序中使用时间,不想操心时间如何计算等细节,这时候我们可以设计factory (工厂)函数,返回指针指向一个计时对象。Factory函数会“返回

    2024年02月12日
    浏览(35)
  • Effective C++ 学习笔记 条款23 宁以non-member、non-friend替换member函数

    想象有个class用来表示网页浏览器。这样的class可能提供的众多函数中,有一些用来清除下载元素高速缓存区(cache of downloaded elements)、清除访问过的URLs的历史记录(history of visited URLs)、以及移除系统中的所有cookies: 许多用户会想一整个执行所有这些动作,因此WebBrowser也

    2024年03月15日
    浏览(34)
  • 【Effective C++】让自己习惯C++

    C++由四个次语言组成: C:过程形式,没有模板、没有异常、没有重载 Object-Oriented C++:面向对象形式,类(构造函数和析构函数)、封装、继承、多态 Template:泛型编程、模板元编程 STL:容器、算法、迭代器和函数对象 目标是让编译器来替代预处理器,使用预处理器会存在

    2024年01月21日
    浏览(39)
  • effective c++ 笔记

    TODO:还没看太懂的篇章 item25 item35 模板相关内容 可以将C++视为以下4种次语言的结合体: C 面向对象 模板 STL 每个次语言都有自己的规范,因此当从其中一个切换到另一个时,一些习惯或守则是可能会发生变化的。 用const替换#define有以下2个原因: #define定义的符号名称可能没

    2024年02月10日
    浏览(21)
  • C++笔记-effective stl

    熟悉stl本身 慎重选择stl容器,每一种stl容器对应不同的使用场景,比如deque往往比vector更加合适 封装stl容器,积极的使用stl,可以高效的使用它 积极使用其对应迭代器使用的函数,比如做相加运算使用accumulate替代for循环,可以更加高效 调用对应的函数的时候,不使用过于复

    2024年01月18日
    浏览(30)
  • 【Effective C++】4. 设计与声明

    如何创建和销毁 初始化对象和对象的赋值应该有什么差别 以值传递意味着什么 新type的合法值 继承体系 类型转换 操作符重载 继承标准 未声明接口 type一般化(template) 有以下几个优势: 1. 语法一致性:访问class成员时每一个都是函数,不需要记住是否需要小括号 2. 使成员

    2024年01月24日
    浏览(29)
  • More Effective C++学习笔记(1)

    在任何情况下都 不能使用指向空值的引用 。一个引用必须总是指向某个对象,必须有初值。 如果变量指向 可修改,且有可能指向null ,就把变量设为 指针 ;如果变量 总是必须代表一个对象(不可能为null) ,就把变量设为 引用 。 引用可能比指针更高效 ,因为不必像指针

    2024年02月12日
    浏览(39)
  • effective c++ 20 传引用代替传值

    本节,作者开始讨论引用。我们知道c语言已经有了指针,通过指针我们也就可以修改变量本身,而不是修改变量的副本(传值), 那么在c++中又搞出来个引用, 那么其是不是有点重复? 我们知道在函数的传参中,如果传递的是指针, 那么就不可避免的要进行取地址和解引

    2024年02月05日
    浏览(32)
  • 《More Effective C++》《基础议题——2、尽量使用C++类型的风格转换》

    类型转换是一般程序员所不能忍受的,但是在紧要关头,类型转换是必须的。C风格的类型转换太过简单,粗暴,不能进行精确的类型转换;为了弥补C转换上功能的不足,C++提供了四种常用的类型转换来应付复杂的转换需求。 static_cast用于在编译时执行类型转换,主要用于相

    2024年01月18日
    浏览(28)
  • 《Effective C++中文版,第三版》读书笔记7

    隐式接口: ​ 仅仅由一组有效表达式构成,表达式自身可能看起来很复杂,但它们要求的约束条件一般而言相当直接而明确。 显式接口: ​ 通常由函数的签名式(也就是函数名称、参数类型、返回类型)构成 ​ 在源码中明确可见。 编译期多态: 在编译时才能确定具体调

    2024年02月09日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包