1.初始化

在C++中,初始化与赋值操作是完全不同的两个操作。初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦除,而以一个新值来代替。

初始化的方式有:

 int test = ;
int test = {};
int test{};
int test();

第3行这种使用花括号初始化的方式被称为列表初始化(C++11新标准)。而从第2行中可以看出,赋值操作也可以采用一组由花括号括起来的初始值来完成。而采用这种初始化的方式的好处在于,在出现初始化操作存在丢失信息的风险时,编译器会进行警告,而另外两个却不会。当然,这必须是在初始化内置类型变量的情况下。

而所谓的丢失信息,譬如将一个占8字节类型的变量赋值给一个占4字节类型的变量时就会存在此类风险。

如果定义变量时没有指定初始值,则变量被默认初始化。堆中的内置变量被初始化为0,栈中的内置变量不被初始化、即其值未定义。类的对象未初始化,则其值由类确定。

类的值其实等同于类内各个成员的值,则上句话的意思就是,如果类的对象没有被初始化,则让编译器去类的定义中看看有没有提供类内初始值(C++新标准),有就照办,没有就别管。

2.引用

引用实质就是为对象起了一个别名而已。引用必须初始化!

int test1 = ;
int &test2 = test1;

此时对test2操作就等同于对test1操作。引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起。而且,引用的类型必须与其所引用的对象的类型一致,但是有两种例外:

第一种情况是在初始化常量引用时允许将结果能转换成引用类型的任意表达式作为初始值。

第二种情况是派生类引用向基类引用的自动类型转换。

3.const限定符

默认情况下,const对象仅在文件中有效。而想要实现只在一个文件中定义const对象,在其他多个文件中声明使用它,则需要该对象声明与定义都添加extern关键字。顶层const、底层const不过就是指针常量和常量指针。

4.constexpr和常量表达式

常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。

将你认为是常量表达式的变量声明为constexpr类型(C++11新标准),以便由编译器检查变量的值是否是常量表达式。声明的constexpr变量一定是一个常量,而且必须使用常量表达式初始化。值得注意的是: 定义一个constexpr类型的指针,限定符constexpr只对指针有效,与指针所指对象无关!

 const int *p = nullptr; //p是一个指向整型常量的指针
constexpr int *q = nullptr; //q是一个指向整型的常量指针

5.类型别名

typedef与C语言一致。

C++有一种新的方法,别名声明。使用关键字using。

using pstring = char *;

其他特性与typedef一致。

值得注意的是类型别名不能像宏定义一样去直接替换理解,而应该将新生成的别名当做是一个新类型去理解。

 using pstring = char *;
const pstring ps1 = nullptr; //指向char的常量指针
const char *ps2 = nullptr; //指向const char的指针

显而易见,2、3行表达意义不同。

6.auto类型说明符

auto类型说明符(C++11新标准)能让编译器通过初始值来推算出变量的类型。显然,auto类型的变量必须有初始值。

int  test = ;
auto index = test; //index为int类型变量

要注意的是当使用auto在一条语句中声明多个变量时,所有变量的初始基本数据类型必须一致,因为一条语句中只能有一个基本数据类型。

7.decltype类型指示符

decltype类型指示符(C++11新标准)可以返回操作数的类型(包括引用及顶层const)。

const int test1 = ;
const int& test2 = test1;
decltype(test1) x = ; //x类型为const int
decltype(test2) x = test1; //x类型为const int&

要注意的有两点:

第一点,如果表达式内容是解引用操作,则decltype将得到引用类型。

第二点,如果给操作变量加上一层或多层括号,则decltypr将得到引用类型。

8.编写自己的头文件

类通常被定义在头文件中,所在头文件名字与类名一致。

为了防止头文件被重复包含,采用预处理功能头文件保护符来进行规避。

man.h

 #ifndef MAN_H
#define MAN_H
#include <string>
class man {
std::string name;
unsigned int age;
};
#endif

C++Primer笔记(1)的更多相关文章

  1. C++ Primer笔记

    C++ Primer笔记 ch2 变量和基本类型 声明 extern int i; extern int i = 3.14;//定义 左值引用(绑定零一变量初始值,别名) 不能定义引用的引用:引用必须 ...

  2. C++ Primer 笔记(1)基础中的战斗机 输入输出 对输入不定数据处理

    今天打算再重新好好的看一遍C++ Primer这本很经典的书籍,笔记开始: 1.每个C++程序都包含一个或者多个函数,其中必须有一个main,操作系统通过调用main入手运行程序: 2.函数包括:返回 ...

  3. C++ Primer 笔记 第一章

    C++ Primer 学习笔记 第一章 快速入门 1.1 main函数 系统通过调用main函数来执行程序,并通过main函数的返回值确定程序是否成功执行完毕.通常返回0值表明程序成功执行完毕: ma ...

  4. C++primer笔记之顺序容器

    最近又重新拾起C++primer,发现每一次看都会有不同的体验,但每一次看后因为不常用,忘记得很快,所以记笔记是很关键的一环,咋一看是浪费时间,实际上是节省了很多时间.下面就把这一节的内容做一个简单的 ...

  5. c++ primer 笔记 (一)

    昨天开始看的<C++ Primer>,确实不错.希望这周抓紧看完,每天做下笔记,以便以后复习. main函数返回一个值给操作系统   操作系统通过main函数返回的值来确定程序是否成功执行 ...

  6. C++ Primer笔记(1)——连续读取数据、类型对应的尺寸、类型转换、字符串分行写法

    这次要看看C++ Primer,这本基本上就是必读书籍了.下面的内容就是一些之前没有学过的知识的笔记. 读取数量不定的输入数据 虽然很简单,但是还是记一下: #include <iostream ...

  7. C++Primer笔记(3)

    标准库类型string表示可变长的字符序列,使用前先包含string头文件.(哈哈,终于可以逃脱C语言中的str函数系列了.)因为是标准库的一部分,所以string被定义在命名空间std中.所以你懂该 ...

  8. C++ Primer 笔记 第三章

    C++ Primer 第三章 标准库类型 3.1using声明 例: using namespace atd; using std::cin; 3.2string类型 初始化方式 string s1 ...

  9. C++ Primer 笔记 第二章

    C++ Primer 第二章 变量和基本类型 2.1基本内置类型 有算数类型和void类型:算数类型储存空间大小依及其而定. 算数类型表: 类型 含义 最小储存空间 bool 布尔型 - char 字 ...

  10. C++ Primer 笔记——数组

    1.数组的大小是固定不变的,声明时必须指定大小(或者使用列表初始化),而且大小必须大于0,C++ Primer里面也建议,如果不确定元素的个数,请使用vector. ]; , , }; //数组长度固 ...

随机推荐

  1. 最短路径floy算法———模板

    #include<cstdio>int n,i[1000][1000];int main(){ scanf("%d",&n); for (int a=1;a&l ...

  2. php 序列化储存和转化 json_encode() json_decode($q,true)

    序列化是将变量转换为可保存或传输的字符串的过程:反序列化就是在适当的时候把这个字符串再转化成原来的变量使用.这两个过程结合起来,可以轻松地存储和传输数据,使程序更具维护性. 例如:当需要数据库只有一个 ...

  3. css之自动换行-设计师零张

    自动换行问题,正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大,挺让人头疼,下面介绍的是CSS如何实现换行的方法 对于div,p等块级元素 正常文字的换行(亚洲文字和非亚洲文字)元素拥 ...

  4. 愉快的开始 - Windows程序设计(SDK)000

    愉快的开始 让编程改变世界 Change the world by program  参考教材 购买链接:Windows程序设计(第5版)(珍藏版)(附CD-ROM光盘1张)  学习环境 视频演示:W ...

  5. Django的 select_related 和 prefetch_related 函数对 QuerySet 查询的优化(二)

    3. prefetch_related() 对于多对多字段(ManyToManyField)和一对多字段,可以使用prefetch_related()来进行优化.或许你会说,没有一个叫OneToMan ...

  6. asp.net mvc4 eui datagrid视图重写分页

    效果图 前端代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="vi ...

  7. 转载:常见EXE文件反编译工具

    PE Explorer V1.99 R5 绿色汉化特别版_强大的可视化汉化集成工具 功能极为强大的可视化汉化集成工具,可直接浏览.修改软件资源,包括菜单.对话框.字符串表等: 另外,还具备有 W32D ...

  8. PowerShell远程连接主机进行会话

    Get-ExecutionPolicy #脚本的执行策略set-ExecutionPolicy 枚举值 不同的策略,执行脚本的权限不同 允许开启远程 Enable-PSRemoting 添加域账户或者 ...

  9. Fish’s mission

    Fish’s mission 也就是求一个坐标到各个食堂的距离和最小,随机化做应该也是可以的.标程用的方法是利用单调性,不断尝试四个方向,二分的方法做的.实际上就是蚁群退火算法. #include & ...

  10. Mysql update 错误

    今天在工作的时候发现自己update 一个表的某个字段超时,想了好久,首先想到的办法是,延长操作时间: mysql> set innodb_lock_wait_timeout=100 mysql ...