c++入门——变量

专栏简介:为什么我要重新介绍c++的相关知识,在此之前,我对于c++的了解也仅仅是在表面。而在后来与c++慢慢的接触中,c++编程语言越来越让我觉得深奥,所以还是想要重新开创一个专栏来介绍c++。对于c++的介绍,本专栏会先介绍98版的c++知识,之后会介绍11版的c++知识。

日常分享:每天努力一点,不为别的,只是为了日后,能够多一些选择,选择舒心的日子,选择自己喜欢的人!

 

目录

1.1、变量定义

1.1.1、初始值

1.1.2、列表初始化

1.1.3、默认初始化

1.2、变量声明和定义

1.3、标识符

1.4、名字的作用域


变量的概念,简单的说就是一个具有名称,可以供程序员操作的一个存储空间。由于c++是静态型编译语言,所以在定义变量时必须明确指明变量的数据类型,这样才能让程序在编译的时候分配合适的内存空间。

1.1、变量定义

变量的定义的基本格式是:首先是类型说明符,然后是变量名组成的列表,变量也可以赋初值,每个同类型的变量之间用逗号分开,结束时用分号隔开。

int i=-30; 
std::string name("Tom"); //name通过一个string字面值初始化

注意:

在c++中,存在对象和变量这两种说法,很多人分不清对象和变量的区别,对象是指的是一块能存放数据并具有某种类型的存储空间。单单从定义上来说,其实都是一个东西。只是有人习惯的把与类有关的称为对象,实际上都可以称为对象,如何称呼完全依据个人的爱好。就像方法函数的区分。

1.1.1、初始值

当对象在创建时获得一个特定的值,我们称为这个对象被初始化了。对于变量的定义,从定义的那一刻开始,在作用域类都是起作用的。

double price=10.98,Alcount=price*3;
//初始化格式正确,price从初始化开始就已经生效。
double sum=add(price,Alcount);
//调用函数add,将函数计算的值的返回给变量,正确。

在这里要注意一下,对于用函数来进行初始化这个问题,在后面会讲到常量表达式,这里会有一点冲突,一定要分清两者之间的差别。在一个就是关于赋值初始化这两者的差别,虽然说不会影响编写程序,但是可以作为一个知识了解。赋值是指的是把对象(变量)当前的值擦除用新的值来代替,而初始化指的是创建变量时赋予一个初始值,二者之间有本质的差别。

1.1.2、列表初始化

对于对象(变量)的初始化,c++提供了多种初始化的方式,关于这些初始化的方式,如果能全部掌握更好,至于喜欢哪种就看个人喜欢。

int untiled=0;
int untiled={0};
int untiled{0};
int untiled(0);

在这几种初始化方式中,我比较推荐的是列表初始化({})。列表初始化虽然会有局限,但是却能帮助我们提高代码的合理性和准确性。

double first=3.1415926;
int second{first},third={first};

像上面这种情况,由于可能存在数据丢失的情况,所以使用列表初始化会导致报错,如果用其他的初始化方式,则不会出现问题:

double first=3.1415926;
int second(first),third=first;

1.1.3、默认初始化

说到变量初始化,就必须谈到一个问题,那就是当你定义了一个变量而没有初始化的时候,当你去输出他的值的时候,会出现奇怪的数值,甚至会出现报错,这是由于c++中有一个默认初始化。在任何的函数体内,变量如果不人为的初始化,则变量不会被初始化,但是定义在任何函数体之外的变量被初始化为0。

注意:

虽然c++有默认初始化机制,但是还是建议变量进行初始化,这样才能保证程序的安全,也能养成好的编程习惯。

1.2、变量声明和定义

关于变量声明和定义这个问题,很多刚入门的小伙伴都不是很了解,因为大家写代码的时候都不会用到太多的文件,变量都是在cpp文件中定义,即使两个文件需要使用相同的变量值,很多人也只是重新定义一个变量。但是在c++中,有一个声明(extern)的功能。

c++中,声明和定义是区分开的,声明使得名字被程序所知,一个文件如果想使用别的文件中的变量,则必须包含对那个变量的声明。定义则是负责创建与名字关联的实体。

变量的声明规定了变量的类型和名字,但是没有声明存储空间,而定义则是为变量开辟了内存空间。

extern int i; //声明i而非定义i
int i=100; //声明且定义i

在使用extern的时候要注意,不要给变量赋初始值,一旦初始化,就不再是声明,而是定义。所以,一旦声明某个变量,就不要给这个变量显示初始化,因为这样会导致extern失去作用。

注意:

变量只能被定义一次,但是可以被声明多次。

1.3、标识符

c++的表示符由字母,数字和下划线组成。数字不能作为开头,只有字母和下划线可以作为开头。

在定义表示符的时候,我们应该遵从相应的规则,这样才能使代码显的更加规整。

定义表示符的规则:

1、尽量使用英语单词或者缩写,要见名知意。

2、变量一般用小写字母开头,类名用大写字母开头。

3、对于组合的单词,中间用下划线隔开。

1.4、名字的作用域

作用域指的是变量或者对象,函数等具有功能的一个范围,通常是以{}位界限。关于作用域这个概念,并没有什么难点,只需要知道,只有在与之对应的作用域内,变量(对象),函数等实体才具有功能。

举个例子:

#include<iostream>
int sclean=40; //全局变量,作用于全局作用域
int main(){

//进入作用域
{
int i=10; //这里的i只能在这里使用,超出作用域就不可使用;
std::cout<<i<<std::endl;
}
int i=100; //这里可以二次定义,因为前面定义的i已经失效
std::cout<<i<<std::endl;
//int sclean=34; //这里错误,函数体内的变量不能与全局变量重名。
return 0;
}

萨和嗯面的程序很好的解释了关于作用域这个概念,当然除此之外,还有while,for等循环之内的作用域,也大差不差。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
第 1 章和第2 章形成了一个独立完整的C++介绍和概述 第一篇的目的是使我们快速地 理解C++支持的概念和语言设施 以及编写和执行一个程序所需要的基础知识 读完这部分 内容之后 你应该对 C++语言有了一些认识 但是还谈不上真正理解C++ 这就够了 那是 本书余下部分的目的 第 1 章向我们介绍了语言的基本元素 内置数据类型 变量 表达式 语句以及函数 它将介绍一个最小的 合法的 C++程序 简要讨论编译程序的过程 介绍所谓的预处理器 preprocessor 以及对输入和输出的支持 它给出了多个简单但却完整的 C++程序 鼓励 读者亲自编译并执行这些程序 第 2 章介绍了 C++是如何通过类机制 为基于对象和面向对 象的程序设计提供支持的 同时通过数组抽象的演化过程来说明这些设计思想 另外 它简 要介绍了模板 名字空间 异常处理 以及标准库为一般容器类型和泛型程序设计提供的支 持 这一章的进度比较快 有些读者可能会觉得难以接受 如果是这样 我们建议你跳过这 一章 以后再回过头来看它 C++的基础是各种设施 它们使用户能够通过定义新的数据类型来扩展语言本身 这些 V 译序 新类型可以具有与内置类型一样的灵活性和简单性 掌握这些设施的第一步是理解基本语言 本身 第 3 章到第 6 章 第二篇 在这个层次上介绍了 C++语言 第 3 章介绍了C++语言预定义的内置和复合数据类型 以及 C++标准库提供的 string complex vector 类数据类型 这些类型构成了所有程序的基石 第 4 章详细讨论了 C++语言 支持的表达式 比如算术 关系 赋值表达式 语句是 C++程序中最小的独立单元 它是第 5章的主题 C++标准库提供的容器类型是第 6 章的焦点 我们不是简单地列出所有可用的 操作 而是通过一个文本查询系统的实现 来说明这些容器类型的设计和用法 第 7章到第12 章 第三篇 集中在 C++为基于过程化的程序设计所提供的支持上 第 7 章介绍C++函数机制 函数封装了一组操作 它们通常形成一项单一的任务 如 print() 名 字后面的括号表明它是一个函数 关于程序域和变量生命期的概念 以及名字空间设施的 讨论是第 8章的主题 第 9 章扩展了第 7 章中引入的关于函数的讨论 介绍了函数的重载 函数重载允许多个函数实例 它们提供一个公共的操作 共享一个公共的名字 但是 要求 不同的实现代码 例如 我们可以定义一组 print()函数来输出不同类型的数据 第 10 章介 绍和说明函数模板的用法 函数模板为自动生成多个函数实例 可能是无限多个 提供了一 种规范描述 prescription 这些函数实例的类型不同 但实现方式保持不变 C++支持异常处理设施 异常表示的是一个没有预料到的程序行为 比如所有可用的程 序内存耗尽 出现异常情况的程序部分会抛出一个异常——即程序的其他部分都可以访问到 程序中的某个函数必须捕获这个异常并做一些必要的动作 对于异常处理的讨论跨越了两章 第11 章用一个简单的例子介绍了异常处理的基本语法和用法 该例子捕获和抛出一个类类型 class type 的异常 因为在我们的程序中 实际被处理的异常通常是一个面向对象类层次 结构的类对象 所以 关于怎样抛出和处理异常的讨论一直继续到第 19 章 也就是在介绍面 向对象程序设计之后 第 12 章介绍标准库提供的泛型算法集合 看一看它们怎样和第 6章的容器类型以及内 置数组类型互相作用 这一章以一个使用泛型算法的程序设计作为开始 第 6 章介绍的iterator 迭代器 在第 12 章将进一步讨论 因为它们为泛型算法与实际容器的绑定提供了粘合剂 这一章也介绍并解释了函数对象的概念 函数对象使我们能够为泛型算法中用到的操作符 比 如等于或小于操作符 提供另一种可替换的语义 关于泛型算法在附录中有详细说明 并带 有用法的示例 第 13 章到第 16 章 第四篇 的焦点集中在基于对象的程序设计上——即创建独立的抽 象数据类型的那些类设施的定义和用法 通过创建新的类型来描述问题域 C++允许程序员 在写应用程序时可以不用关心各种乏味的簿记工作 应用程序的基本类型可以只被实现一次 而多次被重用 这使程序员能够将注意力集中在问题本身 而不是实现细节上 这些封装数 据的设施可以极大地简化应用程序的后续维护和改进工作 第 13章集中在一般的类机制上 怎样定义一个类 信息隐藏的概念 即 把类的公有 接口同私有实现分离 以及怎样定义并封装一个类的对象实例 这一章还有关于类域 嵌 套类 类作为名字空间成员的讨论 第 14 章详细讨论 C++为类对象的初始化 析构以及赋值而提供的特殊支持 为了支持 这些特殊的行为 需要使用一些特殊的成员函数 分别是构造函数 析构函数和拷贝赋值操 作符 这一章我们还将看一看按成员初始化和拷贝的主题 即指一个类对象被初始化为或者 VI 译序 赋值为该类的另一个对象 以及为了有效地支持按成员初始化和拷贝而提出的命名返回值 named return value 扩展 第 15 章将介绍类特有的操作符重载 首先给出一般的概念和设计考虑 然后介绍一些 特殊的操作符 如赋值 下标 调用以及类特有的 new和 delete操作符 这一章还介绍了类 的友元 它对一个类具有特殊的访问特权 及其必要性 然后讨论用户定义的转换 包括底 层的概念和用法的扩展实例 这一章还详细讨论了函数重载解析的规则 并带有代码示例说 明 类模板是第 16 章的主题 类模板是用来创建类的规范描述 其中的类包含一个或多个 参数化的类型或值 例如 一个 vector 类可以对内含的元素类型进行参数化 一个 buffer 类 可以对内含的元素类型以及缓冲区的大小进行参数化 更复杂的用法 比如在分布式计算中 IPC接口 寻址接口 同步接口等 都可以被参数化 这一章讨论了怎样定义类模板 怎样 创建一个类模板特定类型的实例 怎样定义类模板的成员 成员函数 静态成员和嵌套类型 以及怎样用类模板来组织我们的程序 最后以一个扩展的类模板的例子作为结束 面向对象的程序设计和 C++的支持机制是第17 18 19 和 20 章 第五篇 的主题 第 17章介绍了C++对于面向对象程序设计主要要素的支持 继承和动态绑定 在面向对象的程 序设计中 用父/子关系 也称类型/子类型关系 来定义 有共同行为的各个类 类不用 重新实现共享特性 它可以继承了父类的数据和操作 子类或者子类型只针对它与父类不同 的地方进行设计 例如 我们可以定义一个父类 Employee 以及两个子类型 TemporaryEmpl 和 Manager 这些子类型继承了Employee 的全部行为 它们只实现自己特有的行为 继承的第二个方面 称为多态性 是指父类型具有 引用由它派生的任何子类型 的能 力 例如 一个 Employee 可以指向自己的类型 也可以指向 TemporaryEmpl 或者Manager 动态绑定是指 在运行时刻根据多态对象的实际类型来确定应该执行哪个操作 的解析能力 在C++中 这是通过虚拟函数机制来处理的 第 17 章介绍了面向对象程序设计的基本特性 这一章说明了如何设计和实现一个Query 类层次结构 用来支持第 6 章实现的文本查询系统 第 18章介绍更为复杂的继承层次结构 多继承和虚拟继承机制使得这样的层次结构成 为可能 这一章利用多继承和虚拟继承 把第 16 章的模板类例子扩展成一个三层的类模板层 次结构 第 19 章介绍 RTTI 运行时刻类型识别 设施 使用 RTTI我们的程序在执行过程中可 以查询一个多态类对象的类型 例如 我们可以询问一个 Employee对象 它是否实际指向 一个Manager类型 另外 第19章回顾了异常处理机制 讨论了标准库的异常类层次机构 并说明了如何定义和处理我们自己的异常类层次结构 这一章也深入讨论了在继承机制下重 载函数的解析过程 第 20 章详细说明了如何使用 C++的iostream输入/输出库 它通过例子说明了一般的数 据输入和输出 说明了如何定义类特有的输入输出操作符实例 如何辨别和设置条件状态 如何对数据进行格式化 iostream库是一个用虚拟继承和多继承实现的类层次结构 本书以一个附录作为结束 附录给出了每个泛型算法的简短讨论和程序例子 这些算法 按字母排序 以便参考 最后 我们要说的是 无论谁写了一本书 他所省略掉的 往往与他所讲述的内容一样 VII 译序 重要 C++语言的某些方面 比如构造函数的工作细节 在什么条件下编译器会创建内部临 时对象 或者对于效率的一般性考虑 虽然这些方面对于编写实际的应用程序非常重要 但 是不适合于一本入门级的语言书籍 在开始写作本书第三版之前 Stan Lippman写的 Inside the C++ Object Model 参见本前言最后所附的参考文献中的 LIPPMAN96a 包含了许 多这方面的内容 当读者希望获得更详细的说明 特别是讨论基于对象和面向对象的程序设 计 时 本书常常会引用该书中的讨论 本书故意省略了 C++标准库中的某些部分 比如对本地化和算术运算库的支持 C++标 准库非常广泛 要想介绍它的所有方面 则远远超出了本书的范围 在后面所附的参考文献 中 某些书更详细地讨论了该库 见 MUSSER96 和 STROUSTRUP97 我们相信 在 这本书出版之后 一定还会有更多的关于 C++标准库各个方面的书面世

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心随而动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值