首页 > 编程语言 >Effective Modern C++ 学习笔记

Effective Modern C++ 学习笔记

时间:2023-04-23 10:45:10浏览次数:59  
标签:Foo const Effective int Modern 左值 C++ foo

闲话

今天是 2023 年 4 月 23 日,俺开始正式学习面试相关内容了。打算先从 Effective Modern C++ 这本书开始学起,作为日后代码风格、习惯的指导。不过俺没有一起学习的小伙伴,qwq。

与 ICPC 切割之后,内心都轻松了许多。小醉一宿之后还是十分愉悦的。

欢迎加入 C++ 学习群:https://jq.qq.com/?_wv=1027&k=TW7t8caN

我在微云中上传了 Effective Modern C++ 英文版 pdf:https://share.weiyun.com/nO38Xq2l

中文 mdBook: https://cntransgroup.github.io/EffectiveModernCppChinese/,翻译得十分不错,在我学习过程中没有太多问题[1]

这书从 \(42\) 个条款item向读者展现了「更高效的 C++」,在列叔叔的入门博客对我这样的 C++ 初学者十分友好。

>>>

目录

引言部分

左值与右值

通常,判断一个表达式是否为左值的小技巧:是否能取得其地址。

一个表达式的类型与它是否是左值、右值无关。即使函数形参是右值引用类型(void func(Foo &&foo) { }),它也依然是左值。

第一章:类型推导

条款一:理解模板的类型推导

模板函数 template <class T> void func(Foo foo) { } 中,Foo 也许不与 T 相同,例如 const T&。在推导时,一般我们会希望传入的 foo 类型与 T 相同,这样 Foo 就能够正确处理。然而有时候 T 的推导会综合 TFoo 二者考虑。

分几种情形考虑:

  • Foo 是一个指针/引用,但不是万能引用。
    步骤如下:

    1. foo 表达式类型是引用,忽略引用。
    2. foo 的类型与 Foo 的类型进行模式匹配,以推导 T。对,就是你想的那个字符串模式匹配,一个萝卜一个坑你总知道吧~
    案例 1:FooT&
    T Foo foo 定义 / 传入
    int int& int int foo = 1
    const int const int& const int const int foo = 1
    const int const int& const int const int& foo = bar
    案例 2:Fooconst T&
    T Foo foo 定义 / 传入
    int const int& int int foo = 1
    int const int& const int const int foo = 1
    int const int& const int const int& foo = bar
    案例 3:FooT*
    T Foo foo 定义 / 传入
    int int* int* &bar
    const int const int* const int* const int* foo = &bar
  • Foo 是一个万能引用,即 T&&
    规则有些特别:
    1. 若 foo 是左值,则 T 被推导为左值引用。
    注意
    2. 若 foo 是右值,则按照上一情形。

    T Foo foo 定义 / 传入
    int int&& 右值 1
    int& int& 左值 int foo = 1
    const int& const int& 左值 const int foo = 1
    const int& const int& 左值 const int& foo = bar
  • Foo 既不是指针,也不是引用。


  1. 待更新 ↩︎

标签:Foo,const,Effective,int,Modern,左值,C++,foo
From: https://www.cnblogs.com/patricky/p/effective-modern-cpp.html

相关文章

  • 基于C++控制台的吃豆人小游戏
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]玩家目标是吃掉所有豆豆,途中,若玩家撞到怪兽则游戏结束。游戏中存在超级豆子,吃到后,所有怪兽静止,且玩家进入无敌状态(可撞怪兽使之回到初始位置)。玩家可使用键盘方向键进行选择、控制移动,回车键确定,Esc键返回,空格键暂停。控制台小游戏......
  • C++创建对象时,有哪些内容?
    数据成员在类的作用域中,数据成员类似全局变量,而成员函数是操作数据成员的函数成员函数内联函数介绍目的:为了提高运行时的效率注意:在内联函数体中不要有复杂结构(如循环语句和switch语句)在类中声明内敛函数的方式:将函数体放在类的声明中使用inline关键词举例classPoin......
  • c++ vector容器类元素初始化,resize,reserve
    vector<Person>p;//此处Person为类名,仅此一行代码,会调用p(即vector本身)的构造函数,此时p是空的,其元素的构造函数并未被调用//p.reserve(3);//reserve函数预留空间,一下为源码template<typename_Tp,typename_Alloc>voidvector<_Tp,_Alloc>::reserve(size_ty......
  • [C++基础] 面向对象、C 与 C++ 区别篇
    [C++基础]面向对象、C与C++区别篇 一、面向对象1面向对象与面向过程的含义?1、面向对象面向对象是把数据及对数据的操作方法放在一起,作为一个相互依存的整体,即对象。对同类对象抽象出其共性,即类,类中的大多数数据,只能被本类的方法进行处理。类通过一些简单的外部接口与......
  • c++打卡训练(14)
    三色球问题:一共十二个球,红色白色都是三个,黑色有六个,摸出八个球,问有几种可能?流程图:伪代码:源代码:#include<stdio.h>intmain(){ intred,white,black; for(red=0;red<=3;red++){ for(white=0;white<=3;white++){ black=8-red-white; if(black<=6){ printf("红色:%d,......
  • 【CMU15-445 FALL 2022】Project #0 - C++ Primer
    关于参考&鸣谢课程官网CMU15445vscode/clionclang12cmake环境配置C++调试窗口显示“forstringvariable【CMU15-445数据库】bustubProject#0:Trie树实现(C++Primer)2022CMU15-445学习群——152391370前言按照课程要求,本文并不会给出实现代码,可以当做是我遇到问题的总......
  • C++课本第四章例题
    个人银行账户管理程序1#include<iostream>2#include<cmath>3usingnamespacestd;4classSavingsAccount{//储蓄账户类5private:6intid;//账号7doublebalance;//余......
  • VC++ | DLL的创建和使用
    文章目录DLL的创建和使用动态链接库概述1.新建项目1-1.新建文件1-2.生成动态链接库2.Dumpbin命令2-1.用法3.从DLL中导出函数4.参考DLL的创建和使用动态链接库概述1.新建项目1-1.新建文件新建DLL1.cpp#include"pch.h"intadd(inta,intb){ return(a+b);}intsubtract(i......
  • C++的拓扑排序实现
    template<typenameT=CString,typename_Data=CString> structUnion_node//!<节点 { Union_node():nColor(0){} std::vector<Union_node*>vecNodeSon; Tkey;//!<关键数据 _Datadata;//!<卫星数据 mutableintnColor;//0:白色节点(未发现),1:灰色节点(发现),......
  • 初学者代码训练Day5(c/c++)
    打鱼还是晒网要求中国有句俗语叫“三天打鱼两天晒网”。某人从1990年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。流程图  代码1#include<iostream>2usingnamespacestd;34intmain()5{intyear=0,month=0,day=......