通常情况下,对象是指一块能存储数据并具有某种类型的内存空间。在使用对象这个名词时,并不严格区分是类还是内置类型,也不区分是否命名或是否只读。
对象的名字随着定义马上就可以使用,因此在一条定义语句中,可以用先定义的变量值去初始化后定义的其他变量。
注:初始化不是赋值,初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把变量的当前值擦除,而以一个新值替代。
作为C++11新标准的一部分,用花括号来初始化变量得到了全面应用,而在之前,这种初始化的形式仅在某些受限的场合下才能使用,这种初始化形式被称为列表初始化。
当用于内置类型的变量时,这种初始化形式有一个重要特点:如果使用列表初始化且初始值存在丢失信息的风险,则编译器将报错:
例:
long double ld = 3.1415926536;
int a{ld}, b = {ld}; // 错误:转换未执行,因为存在丢失信息的风险
int c{ld}, d = ld; // 正确:转换执行,且确实丢失部分值
如果定义变量时没有指定初值,则变量被默认初始化,即变量被赋予默认值。
如果是内置类型的变量未被显式初始化,它的值由定义的位置决定:1)定义在任何函数体之外的变量被初始化为0;2)定义在函数体内部的内置类型变量将不被初始化。
绝大多数类都支持无须显式初始化而定义对象,这样的类提供了一个合适的默认值,例如string类规定如果没有指定初值则生成一个空串。
注:建议初始化每一个内置类型的变量!!
声明(declaration)使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对这个名字的声明。
而定义(definition)负责创建与名字相关联的实体。
如果想声明一个变量而非定义它,就在变量名前加上extern关键字,而且不要显式地初始化变量。
注:1)任何包含显式初始化的声明即成为定义。如,给由extern关键字标记的变量赋一个初始值,就会抵消extern的作用。
2)在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误。
3)变量能且只能被定义一次,但是可以被多次声明。
4)如果在多个文件中使用一个变量,变量的定义必须出现在且只能出现在一个文件中,而其他用到该变量的文件必须对其进行声明,却绝对不能重复定义。
变量命名规范:
1) 标识符要能体现实际含义;
2)变量名一般用小写字母,如index,不要使用Index或INDEX;
3)用户自定义的类名,一般以大写字母开头,如Sales_item;
4)如果标识符由多个单词组成,则单词间应有明显区分,如student_loan或studentLoan,不要使用studentloan。
名字的有效区域(作用域)始于名字的声明语句,以声明语句所在的作用域末端为结束。
建议:在对象第一次被使用的地方附近定义它是一种好选择
作用域中一旦声明了某个名字,它所嵌套着的所有作用域中都能访问该名字。同时,允许在内层作用域中重新定义外层作用域已有的名字。
注:1)因为全局作用域本身并没有名字,所以当作用域操作符的左侧为空时 (如 ::A ),向全局作用域发出请求获取作用域操作符右侧名字对应的变量。
2)如果函数有可能用到某全局变量,则不宜再定义一个同名的局部变量。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!