开发者社区> Daz> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

[c++ primer笔记]2-变量和基本类型

简介: 变量和基本类型
+关注继续查看

2.1 基本内置类型

  • 当明确知晓数值不可能为负时,选用无符号类型
  • int爆了就直接用long long
  • 浮点直接用`double

2.2 变量

  • 对与C++程序员,变量variable对象object一般可以互换使用

    • 对象:通常指一块能够存储数据并具有某种类型的内存空间
  • 初始化与赋值是两个完全不同的概念:

    • 初始化:创建变量时赋予一个初始值
    • 赋值:将对象的当前值擦除,而以一个新值来代替
  • 列表初始化:
int a = 0;
int a = {0};
int a{0};
int a(0);

2.3 复合类型

  • 每条声明语句由一个基本数据类型(base type)和紧随其后的声明符(declarator)列表构成

    • 声明符为变量名时变量的类型就是基本数据类型

引用

  • reference
  • 指的是“左值引用(lvalue reference)”,C++11新增了“右值引用(rvalue reference)”
  • 引用就是给对象起了另外一个名字
int a = 1024;
int &b = a;//b指向a(b是a的另外一个名字)
int &c;//报错
  • 引用必须被初始化

    • 在定义引用时,它会与初始值绑定bind在一起,无法再重新绑定,所以必须初始化
    • 引用必须绑定在对象上
  • 引用即别名:引用并非对象,而是为已经存在的对象另起别名

指针

  • point指向 另外一种类型的复合类型,也实现了对其他对象的间接访问
  • 与引用区别:

    • 指针本身就是一个对象,允许对指针赋值和拷贝,可在生命周期内先后指向多个对象
    • 无需在定义时赋初值
    • 在块作用域未初始化会拥有一个不确定的值
double dp, *dp2;//dp是double型对象,dp2是指向double类对象的指针
  • 获取对象的指针
int *p = &ival;

引用和取地址共用符号&

  • 利用指针访问对象
int *p = &ival;
cout << *p;
  • 空指针:

    • null pointer
int *p1 = nullptr; // 等价 int *p1 = 0;
int *p2 = 0;       // 直接初始化为字面常量0
#include cstdlib
int *p3 = NULL;    // 等价 int *p3 = 0;
- 最好使用第一种(c++11新标准)
- 最好初始化所有指针
int zero = 0;
pi = zero;

是错误的,即使zero为0,不能吧int变量赋给指针

  • tips:

    • 任何非0指针对应的条件值都是true;
  • void* 指针

    • void* 是特殊指针类型,可存放任何对象的地址
    • 我们不能知道该地址到底是个什么类型的对象
  • 理解复合声明

    • 定义多个变量
    • 指向指针的指针
    • 指向指针的引用:引用本身不是对象,所以不能有指向引用的指针,但指针是对象,可以有对指针的引用

2.4 const

2.4.1 const限定符

  • const对象必须初始化
  • const的引用
const int ci = 1024;    //right
const int &r1 = ci;     //right,引用及其对象都是常量
r1 = 42;                //错误:r1是对常量的引用
int &r2 = ci;           //错误:试图让一个非常量引用指向一个常量对象
  • 引用的类型必须与其引用对象的类型一致:(除两种特殊情况)

    • 初始化常量引用时允许用任何表达式作为初始值,只要能强制类型转换就行[临时量]
    • 为常量引用绑定一个非常量

2.4.2 指针和const

  • 指向常量的指针不能用于改变其所指对象的值
  • tips:

所谓指向常量的指针和引用,不过是指针或引用自以为是罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值

  • 常量指针必须初始化

2.4.3 顶层/底层指针

  • 顶层指针:top-level const:指针本身就是个常量
  • 底层指针:low_level const:指针所指的对象是个常量
  • 一眼顶真o(^^o)

2.4.4 constexpr

  • 将变量声明为constexpr,以便编译器来验证变量的值是否是一个常量表达式
constexpr int chsm = 20;//20是常量表达式
constexpr int sz = size();//只有当size是一个constexpr函数
                          //其才是一条正确的声明语句
  • 一般来说,如果你认定一个变量是常量表达式,就把它声明成constexpr类型
  • constexpr与指针:

此限定符只对指针有效,与指针所指对象无关

const int *p = chsm;    //p是一个指向整型常量的指针
constexpr int *q = chsm;//q是一个指向整数的常量指针
  • constexpr将其定义的对象设置为了顶层指针

2.5 处理类型

2.5.1 类型别名

  • typedef
typedef oldname newname
  • 别名声明alias declaration
using newname = oldname;
  • 符合类型不能简单的翻译回去理解
typedef char *pst;
const pst cstr = 0;

const char* cstr = 0是对const pst cstr = 0的错误理解

改写前声明了一个指向char的常量指针
改写后声明了一个指向const char的指针(*成了声明符的一部分)

2.5.2 auto类型说明符

  • 让编译器去分析表达式所属类型
auto item = i1 + i2;

根据相加结果推断出item的类型

  • auto一般会忽略掉顶层const,若需保留则自己手动声明
  • 设置一个引用类型为auto,则初始值中的顶层const依然保留

2.5.3 decltype类型指示符

decltype( f() ) sum = x;

sum的类型由函数f的返回值绝对,decltype并不实际调用f()

  • decltype的括号:
decltype( (i) ) d;
decltype ( i ) d;

双层括号的结果永远是引用,单括号只有当i本身为引用时才为引用

2.6 自定义数据结构

没学到class前一直用struct就好

2.6.3 编写自己的头文件

  • 头文件保护符
#ifndef SALS_DATA_H
#define SALS_DATA_H
#include <string>
struct Sales_data{
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
#endif
  • 别想自己的程序用不用的到,加上就完事了

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
队列的存储结构的实现(C/C++实现)
存档 1 #include "iostream.h" 2 #include "stdlib.h" 3 #define max 20 4 typedef char elemtype; 5 #include "queue.
923 0
《测试驱动的嵌入式C语言开发》——2.3节CppUTest:一个用C++实现的自动化单元测试框架
本节书摘来自华章社区《测试驱动的嵌入式C语言开发》一书中的第2章,第2.3节CppUTest:一个用C++实现的自动化单元测试框架,作者:(美)James W. Grenning,更多章节内容可以访问云栖社区“华章社区”公众号查看
1452 0
C++函数模版实现
若一个程序的功能是对某种特定的数据类型进行处理,则将所处理的数据类型说明为参数,那么就可以把这个程序改写成为模版,模版可以让程序对任何其他数据类型进行同样方式的处理。 本节主要是说一下C++的函数模版,函数模版的定义一般形式是: template  返回类型    函数名(形参) {     ...
1031 0
C++抽象类的实现
1、什么是抽象类? 答:简单的说,抽象类就是至少有一个纯虚函数的类。 2、抽象类的作用? 答:抽象类的主要作用就是为它所组织的继承层次结构提供一个公共的基类,这样它就具有公有行为的特征,其它派生的类可以从这个公共的基类中继承和实现接口,通过抽象类多态的使用其中的成员函数。
1018 0
C++纯虚函数实现
纯虚函数就是一个在基类中的虚函数,差别只是在一般的虚函数声明的后面加了“=0”,虚函数允许函数通过与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,称为运行时的多态性,虚函数是可以有具体实现代码的。
843 0
C++友元类实现
C++中的友元既可以实现友元函数,也可以实现友元类,也就是说一个类也可以作为另外一个类的友元。当作为一个类的友元时,它的所有成员函数都是另一个类的友元函数,都可以访问另一个类的私有或者公有成员。 请看实例: #include #include using namespace std ; /...
913 0
+关注
Daz
10
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载