【共读Primer】9.[2.2] 变量 Page38
定义方式为在类型说明符后紧跟一个或多个变量名
int sum = 0, value, // sum、value和units_sold都是int units_sold = 0; // sum和units_sold初始值为0 Sales_item item; // item的类型是Sales_item // string 是一种库类型,表示一个可变长的字符序列 std::string book("0-201-78345-X"); // book 通过一个string字面值初始化
在我的文章中多次提到对象,一般而言,对象是指一块可以存储数据并有某种类型的内存空间。
也就是说,对象是有了实际地址的一个类型。
对象和类这个概念在初学的时候比较难理解,我举个简单的例子。
前两天我和女儿参加了一个手工饼干的活动,在活动中每个小朋友得到一块巴掌大的面团,然后有很多饼干的模具。
女儿就是讲面填入模具,然后将面挤压天面模具,然后将地面在操作台上压平。
那么形象的比方,我女儿得到的面团就是“内存”,模具就像是“类”,而挤压好的饼干就是“对象”。
对象创建时获得一个特定的值,我们叫做初始化。
// price先被定义并复制,随后被用于初始化discount double price = 109.99, discount = price * 0.16; // 调用函数applyDiscount,然后用函数的返回值初始化salePrice double salePrice = applyDiscount(price,discount);
在C++中 初始化 和 赋值 不是一个概念。
虽然在很多语言中这两者的区别可以忽略,但是在C++一些特别的情况下是至关重要的。
1 #include <iostream> 2 3 int main() 4 { 5 // 下面的四中初识话方式可以达到相同的目的 6 int units_sold1 = 0; 7 int units_sold2 = {0}; 8 int units_sold3{0}; 9 int units_sold4(0); 10 11 long double ld = 3.1415926536; 12 int a{ld}, b = {ld}; // 由于可能会丢失数据,编译器报错 13 int c(ld), d = ld; 14 }
初始化的工作是非常重要的。
大部分的类型会被进行默认初始化。
但是在类内部的内置类型不被初始化。如果使用这些没有初始化的变量,将导致不可预知的事情。
为了支持分离式编译过程,C++中可以对一个变量进行多次声明,但是只能进行一次定义。
extern int i; // 声明i而不是定义i(它仅仅是一个声明,不能初始化) int j; // 声明并且定义j
上方代码中的i和j成为变量名或标识符。
标识符由字母、数组和下划线组成。必须以字母或下划线开头
命名的一般规范
1. 体现具体含义
2. 小写字母
3. 自定义类名大写开头
4. 多个单词拼接时,每个单词首字母大写
当然也需要避开系统已有的关键字,按首字母序的关键字列表:
alignas | continue | friend | register | true |
alignof | decltype | goto | reinterpret_cast | try |
asm | default | if | return | tpedef |
auto | delete | inline | short | typeid |
bool | do | int | signed | typename |
break | double | long | sizeof | union |
case | dynamic_cast | mutable | static | unsigned |
catch | else | namespace | static_assert | using |
char | enum | new | static_cast | virtual |
char16_t | explicit | noexcept | struct | void |
char32_t | export | nullptr | switch | volatile |
class | extern | operator | template | wchar_t |
const | false | private | this | while |
constexpr | float | protected | thread_local | |
const_cast | for | public | throw |
建议在变量的第一次使用时再去定义它。
因为变量含有一定的作用域,在不同作用域下可以使用相同的名称,但是可能代表不一样的类型。