C++基础——1.变量和基本类型(基于c++11)
C++11类型
基本类型
字面值常量(literal)
比如:一个形如42的值,即为常量变量
- 初始值
初始化不是赋值,初始化是创建变量的时候给一个初始值;而赋值是擦除当前值,用新值代替。 - 列表初始化
c++11允许使用{}来初始化变量。
比如:
int units_sold{0};//表示该值被初始化为0
同理,对于vertor:
vector<string> astr = {"abc", "is", "alphbat"};
- 初始化方式
itn a = 0;//使用‘=’,拷贝初始化
int a = {0};
int a{0};
int a(0);//不使用‘=’,直接初始化
- 拷贝初始化:
使用‘=’
编译器把等号右边的初始值拷贝到新创建的对象中。
只能提供一个初始值 - 直接初始化:
不使用‘=’,比如int a(0)
当初始值只有一个时,使用直接初始化或拷贝初始化都行。如果初始化需要多个值,则只能用直接初始化。
比如:
string str(3,'c');//str = "ccc";
- 注意:
如果是类内初始值,那么只能使用拷贝初始化或者花括号形式,
一定不能使用圆括号【变量后面跟着原括号像以该变量类型和原括号内容生成的一个类】(在类中有
string a = string('c'),带有迷惑性)。 - 初始化值为列表时,只能使用花括号进行列表初始化。
- 拷贝初始化:
- 默认初始化
没有赋值的变量编译器会自动为其赋一个初值。但是,函数内定义的内置类型变量不被初始化。 - 作用域范围
就近定义变量原则。
- 初始值
复合类型
- 引用(别名)
- 初始化时候绑定初始值,一旦完成绑定,无法重新绑定到另一个对象。
- 没有引用的引用
- 只有对象才有引用
- 指针
- nullptr
建议初始化所有的指针。 - 永远记住赋值改变的是等号左边的值。
比如:int *p = nullptr;
p = &ival;//改变的是p的内容,即存放在pi内的地址值。
*p = 0;//改变的是*p的内容,即p指向对象的值。
- nullptr
- void * 指针
- 指向指针的指针
- 指向指针的引用
引用不是对象,所有没有指向引用的指针。但是指针是对象,所有存在指向指针的引用。
- 引用(别名)
const
- 初始化
const int ci = i;
int j = ci;//没有改变ci值是可以的
- 默认情况下,const对象只在文件内有效
- 多个文件使用const对象
extern const int bufsize;
- const的引用 = 也称为常量引用
const int ci=1024;
const int &r = ci;//r不能被改变
- 引用的类型必须与其所引用对象的类型一致
例外:- 初始化常量引用允许任意表达式作为初始值
int i = 42;
const int &r1 = i;
const int &r2 = 42;
const int &r3 = 2 * r1;
- 初始化常量引用允许任意表达式作为初始值
- 对const的引用可能引用一个并非const的对象
比如:int i=0;
int &r1 = i;
const int &r2 = i;
r1 = 3;//正确
r2 = 4;//错误
r2绑定非常量是合法的。不允许通过r2修改绑定对象。可以类比const *int常量指针。
- 指针与const
- 指向常量的指针(pointer to const)
const int *** 表示 int * **内容是常量
不能改变其所指的对象的值
要想存放常量对象的地址,只能使用指向常量的指针。const double pi = 3.14;
double *ptr = π //错误,用一个非常量指针指向常量对象
const double *cptr = π //正确,指向常量对象的地址,需要使用常量指针。
可以有这样的情况:
double dval = 3.3;
const double *cptr = dval;//允许,同常量引用一样,不能通过*cptr改变dval的值。
- const指针 = 常量指针 =(const point)
int const 表示指针是常量
指针是对象,可以把自身定义为常量。因为自身是常量,不允许修改,所以定义时,就要初始化。* - 如何区分
从右向左读。int errNumb = 0;
int *const errptr = &errNumb;//errptr永远指向errNumber,即errptr不能再指向其他对象了。
*errptr = 3;//errNumb是非常量,可以通过*errptr改变。
- 指向常量的指针(pointer to const)
- 顶层const
表示指针本身是一个常量。int i = 0;
int const* p1 = &i;//p1不能改变,是顶层
const int c1 = 42; //c1不能改变,是顶层
- 底层const
表示指针所指对象是一个常量。
const int *p2 = 42;//p2可以改变,是顶层
- 指针即可以是顶层也可以是顶层。
- constexpr 和常量表达式
- 常量表达式
值不会改变并且在编译过程就能得到计算结果的表达式。const int max_files = 20;
const int limit = max_files + 1;//都是常量表达式
- constexpr变量
c++11新规定,允许将变量声明为constexpr类型,由编译器来识别是不是常量表达式。constexpr int mf = 20;
constexpr int limit = mf + 1;
constexpr int sz = get_size();
- constexpr声明中有定义指针,那么constexpr仅对指针有效,与指针所指对象无关。
const int *p = nullptr; //p是一个指向整形常量的指针(所指的内容是常量)
constexpr int *q = nullptr; //q是一个指向整数的常量指针(指针是常量)
- constexpr指针的初始化值必须是0/nullptr/固定地址。所以函数体内不能定义(对象在堆栈上,不是固定地址)。
- 常量表达式
对复杂类型的处理
- 别名
- typedef
能区分typedef char* pstring;
const pstring cstr = 0;
const pstring *ps;
对于
const pstring cstr = 0
,const是修饰谁?
修饰char*
,修饰的是指针(即是常量指针),而不是等价const char * cstr
(修饰的是指针指向的内容)
这里需要将typedef修饰的类型作为整体去看,而不是简单的替换。
对于const pstring *ps
,ps是一个指针,该指针指向char的常量指针。(二阶指针) - using(新规定)
using PP = People;
,用PP作为People类的别名。
- typedef
- auto(C++11引入)
- auto让编译器通过初始值来推算变量的类型。auto的定义必须有初始值。
- auto忽略顶层const:
const int ci = i, &cr = ci;
auto b = ci;//忽略ci的顶层const,这里b是一个int类型
auto c = cr;//cr是别名,auto声明为引用所引用对象的类型,这里c是int型。
auto d = &i;//&i是int *,所以d是 int *;
auto e = &ci;//&ci是对常量对象的取址(底层的const),e是指向常量对象的指针。
- 希望是顶层const需要明确指出:
const auto f=ci;
- auto的引用
auto &g = ci;//ci是一个整形常量,那么g是整形常量引用
auto &h = 42;//错误,不能把非常量引用绑定到字面值
const auto &j = 32;//正确,常量引用绑定到字面值
- decltype(C++11引入)
从表达式推出要定义的变量的类型,但是不想用该表达式的值初始化变量。
decltype(f()) sum = x;//sum的类型是f()的返回类型
- decltype处理顶层const和引用的方式 与 auto不同:
const int ci = 0, &cj = ci;
decltype(ci) x = 0; //x是const int
decltype(cj) y = x; //y是const int&
decltype(cj) z; //z是const int&,没有初始化,错误
- decltype 与 引用
decltype使用的表达式不是一个变量,则decltype返回表达式结果对应得类型。int i = 42, *p = &i, &r = i;
decltype(r+0) b;
//decltype(r) x,x是int &,但是b是 r+0的表达式,其是r(i的别名)+0的结果的类型,所以b是int类型。
decltype (*p) c;
//decltype(p) y,y是int *类型,但是decltype(*p)是解引用操作,即为int &c;错误,需要初值。
- decltype((val))和decltype()
双括号永远是引用,单括号看值类型。
- decltype处理顶层const和引用的方式 与 auto不同:
- 别名
自定义结构
- c++11支持类内初始值,之前版本不支持(被认为还没有实例,不能被赋值)。
- c++11中没有被赋初始值的,会被赋默认值。
- 类内初始值限制:放花括号,或等号右边。一定不能放圆括号。(圆括号是对象实例初始化使用,这里还没有对象实例)
- c++11支持类内初始值,之前版本不支持(被认为还没有实例,不能被赋值)。
C++基础——1.变量和基本类型(基于c++11)的更多相关文章
- 第1节 Scala基础语法:5、6、7、8、基础-申明变量和常用类型,表达式,循环,定义方法和函数
4. Scala基础 4.1. 声明变量 package cn.itcast.scala object VariableDemo { def main(args: Array[Strin ...
- Java知识系统回顾整理01基础03变量02基本变量类型
一.变量类型分类 一个变量的类型,决定了该变量可以包含什么样的值. Java中有八种基本类型,都是Java语言预先定义好的,并且是关键字. 这八种基本类型分别是: 整型 (4种) 字符型 (1种) ...
- 016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值
016 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 10 布尔类型和字符串的字面值 本文知识点:字面值 关于字面值的概念,需要注意:很多地方,我们可能就把字面值 ...
- Shell基础:变量类型 & 运算符
Shell变量 Shell支持三种类型的变量 用户自定义变量:用户自定义的变量,变量名以英文字母或下划线开头,区分大小写. 位置变量:根据位置传递参数给脚本的变量,默认支持9个位置变量 $1,$2,$ ...
- C/C++基础----变量和基本类型
变量和基本类型 不同平台下基本类型的字节数 类型 16位平台 32位平台 64位平台 char 1 1 1 short 2 2 2 int 2 4 4 long 4 4 8 long long / 8 ...
- js基础之变量类型
1.NAN(Not a number) 不是一个数字 自身:console.log(NaN==NaN)和console.log(NaN===NaN)返回值都是false; 其他函数,isNaN()可用 ...
- Swift语言指南(七)--语言基础之布尔值和类型别名
原文:Swift语言指南(七)--语言基础之布尔值和类型别名 布尔值 Swift有一个基本布尔类型,叫做布尔(bool),布尔值又称逻辑值(logical),因为它只能为真(true)或假(false ...
- Java 基础复习 基础数据类型与包装器类型
Java 基础 基础数据类型与包装器类型 基础数据类型 java 中包含哪些基础数据类型,默认值分别是多少? 基础数据类型 byte short int long double float char ...
- PHP语法(一):基础和变量
相关链接: PHP语法(一):基础和变量 PHP语法(二):数据类型.运算符和函数 PHP语法(三):控制结构(For循环/If/Switch/While) 最近有个H5项目的需求,需要服务端,考察过 ...
随机推荐
- 数据结构之Hyperloglog
前置知识 调和平均数 通常我们求一堆数的平均数 就是把一堆数加起来除以这堆数的数量,如 x1, x2, x3, x4, .... ,xn的平均数 H = (x1 + x2 + x3 + x4 + xn ...
- 使用gulp-uncss精简css,去除冗余代码
写html页面的时候,多修改几次就会出现很多无用的css代码,下面使用gulp-uncss来精简css文件,去掉没用的css代码 1.首先找个目录创建一个gulp项目在命令行输入:npm init ...
- java学习笔记(3)——对象与类(日期)
变量.类型.赋值.运算符等等: https://blog.csdn.net/common77zwq/article/details/81988676 1.概念: 面向对象程序设计OOP.类class. ...
- vue2.0:(七)、vue-resource
本篇文章开始前,先介绍下什么是vue-resource,并且现在还有一个axios. Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必 ...
- vuejs 学习旅程一
来上海快一年了,一直在东钿金融工作着,这一年来主要负责公司前期的房产评估微信平台,公司IT部也是刚刚成立,成立IT部门不仅仅只是维护房产评估微信,而是要做一个互金理财平台.于是我一年来的主要工作是负责 ...
- <Android 应用 之路> 天气预报(一)
Android天气预报客户端 设计思路 欢迎界面,版本号,应用名 + 数据后台加载(所有城市的信息获取) 数据加载完成后跳转到显示界面,显示所有查询到的城市的天气信息 欢迎界面和天气显示界面分别为单独 ...
- iOS 应用架构 (三)
iOS 客户端应用架构看似简单,但实际上要考虑的事情不少.本文作者将以系列文章的形式来回答 iOS 应用架构中的种种问题,本文是其中的第二篇,主要讲 View 层的组织和调用方案.下篇主要讨论做 Vi ...
- MySQL查询优化方法总结
1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉 ...
- JavaScript对象属性
JavaScript对象的属性有两类:数据属性和访问器属性 数据属性 数据属性有四个特性,分别为: [[value]]属性的值 [[writeable]]属性是否可以修改 [[enumerable]] ...
- UVA12897 - Decoding Baby Boos
没必要每次都真的修改一遍字母值,用一个标记表示字母最后的值,最后一遍的时候再进行修改 #include<cstdio> #include<cstring> +; char st ...