首页 > 编程语言 > 详细

有关C++中变量和类型的查漏补缺

时间:2021-05-30 22:51:18      阅读:19      评论:0      收藏:0      [点我收藏+]

内置类型

  • 其他类型不加unsigned默认是有符号的,char类型比较特殊,有无符号取决于编译器,因此使用char最好明确指定unsigned
  • 给无符号类型赋值如果超过范围会绕圈,给有符号类型赋值如果超过范围则值为未定义
  • 变量的值未定义程序可能崩溃,也可能运行,但要避免这种情况,万一真的崩溃了呢
  • unsigned和带符号类型在表达式里混用很危险,因为带符号类型会被转换为unsigned,要是负数值就不是想要的值了
  • 字面值常量就是值一望便知的对象,通过加前后缀(字符(串)加前缀,整型浮点型加后缀,具体加啥可以查表)来改变默认类型
    • 十进制的字面值类型默认是带符号的int,八进制和十六进制则不一定
    • 浮点类型的字面值默认是double
    • bool字面值包括truefalse
    • 指针字面值指的是nullptr
    • 当然还有字符字面值和字符串字面值(就是末尾带个‘\0‘的字符数组)
  • 转义字符中如果使用8进制的转义字符,只会将\后面三个字符加入转义,而使用16进制则将后面所有字符加入转义,所以可能会出错

变量

  • 类型前加extern可以不用初始化变量只声明他,但是要是给初值那extern就没用了,而且要是在函数内给初值还会报错
  • extern#include的区别在于#include把人家整个头文件都包含进来了,而extern针对需要的变量,并且是从源文件中调用
  • 命名规则中还不可以出现连续两个下划线以及下划线连大写字母这种形式,函数体外更是连下划线开头都不行
  • 当全局变量被局部变量覆盖了(虽然应该避免这种情况),可以使用::变量名来直接调用全局变量

初始化

  • 列表初始化如果数据有丢失风险,编译器会报错的
  • 对于默认初始化(不给初值时),内置类型为0(函数内变量例外,没有默认值,值未定义),类类型自己决定

引用

  • 引用必须被初始化
  • 因为引用不是对象,所以没有引用的引用
  • 引用不能绑定在字面值和表达式的结果上

指针

  • 在块内没有赋初值的指针其值也是未定义的
  • 引用与指针的类型和绑定的对象要严格一致,只有两种情况例外
    • 基类指针可以指向派生类
    • 初始化常量引用、指针时可以使用任意能转换的值
  • 预处理变量NULL虽然可以定义空指针,但是不建议在C++里这么做
  • void*指针可以存任何类型的地址,虽然可以比较、作参数、作返回值,但是不能使用其所指的对象,因为不知道类型也就不知道有什么操作
  • 指针若是const的,必须初始化,因为编译器要替换,必须知道他的值

const

  • 用于初始化的变量不用担心const的限制,因为不算作改变const变量,毕竟还没有值呢
  • 多个文件中的同名const是独立的,如果想让各文件共用该变量,必须在声明和定义前上extern,而变量只需要声明extern即可

constexpr

  • 常量表达式指的是编译时就知道结果,那么字面值常量肯定是,用常量表达式初始化的const(必须是)表达式也是常量表达式
  • 一个表达式或者变量是不是常量表达式要看类型是不是const,还要看用来初始化的值是不是常量表达式,缺一不可
  • 如果声明一个变量为constexpr,那么他一定是常量表达式,就不用操心const变量的初始值是不是常量来判断是不是常量表达式了
  • 普通的类是不能声明成constexpr的,因为编译器不知道是什么值
  • constexpr一个指针的时候指的就是指针,而不是指向const的变量,相当于定义了顶层const

类型别名、autodecltype

  • 注意类型别名用到指针上的时候,定义变量时前面如果有const,修饰的是这个类型,而不是像普通情况下是指向const类型的值
  • auto一个引用时,推出的类型是他引用的类型
  • auto会扒下顶层const,即auto一个顶层const,会推出非const的类型,要是就想让其推出const,则在auto前面加const
  • 利用auto同时声明多个变量的时候,必须保证变量的基本类型是一样的(const intint是两个基本类型)
  • 虽然之前说声明引用的const都是底层的,但是当用auto推断一个顶层常量时,得到的const是顶层的
  • decltypeauto的另一种形式,不过他接受表达式或者函数的时候不去计算
  • decltype接收的是什么类型就会返回什么类型,尽管引用在其他任何地方都是所绑对象的代名词,但在decltype这里还是会被老老实实的返回引用类型
  • decltype接收解引用的时候,返回的是引用,这并不违背上一条,因为解引用,解出来是个引用
  • decltype如果接收了带括号的变量,会将他看成一个特殊的表达式(特殊在可以作为左值),此时会返回引用类型
  • 赋值表达式会产生引用类型

预处理器

  • 预处理器利用头文件保护符#define#ifdef#ifndef#endif防止了头文件被多次包含还能正常运行,

有关C++中变量和类型的查漏补缺

原文:https://www.cnblogs.com/NoteofZy/p/14829044.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!