C++程序设计基础(2)变量
注:读《程序员面试笔记》笔记总结
1.知识点
(1)C++变量命名只能包含字母、数字、下划线,其中开头不能是数字;大小写敏感;习惯上变量用小写字母,常量、宏定义用大写字母。
(2)变量的作用域分为局部变量(函数内部定义),全局变量(函数外部定义)。
(3)关键字extern:在头文件总声明变量,并在前面加上extern,在源文件中定义变量,其他文件使用#include导入头文件,即可使用该变量。附详细链接https://blog.csdn.net/chenqiai0/article/details/8490665
//test.h
extern int age;
//test.cpp
#include"test.h"
int age = ; //直接使用age=10是不行的
//test1.cpp
#include"test.h"
int main(int argc, char *argv[]) {
cout << age << endl;
getchar();
return ;
} /*output
10
*/
(4)关键字static:静态变量,首次执行时初始化,其后再执行将不再进行初始化,虽然可能是局部变量,但其生命周期是整个程序运行过程。
(5)关键字const:常量型变量,在头文件中直接定义和声明(不同于一般全局变量),其他文件通过#include使用(多个文件引用不会造成重复定义),如果在源文件中定义,则其作用域值是本源文件。
2.面试题
2.1简述i++和++i的区别
写出下面代码执行后i,j,m,n的值
int i=,j=;
int m=(i++)+(i++)+(i++);
int n=(++j)+(++j)+(++j);
知识点:++i是先自身加一,然后再参与赋值运算,i++是先参与赋值运算,然后再自身加一。
本题的特殊之处是不同的编译器会产生不同的结果,在VC编译器中,全部会先完成三个++j,然后再做加法运算,而在gcc编译器中当有两个操作数时就会进行加法运算。故结果如下:
#VC编译器
i=,j=,m=,n=;//13+13+13=39
#gcc编译器
i=,j=,m30,n=; //12+12+13=37
2.2简述C++的类型转换操作符
在C语言中类型转换只需要通过变量前面加上变量类型,并且转换是双向的,这种方式对于简单类型可以,复杂数据类型就力不从心了。
C++提供了四种类型转换操作符:static_cast,dynamic_cast,const_cast,reinterpret_cast。
(1)static_cast可以完全替代C风格类型转换实现基本类型转换;
int i = ;
double d = 1.5;
int d2i = static_cast<int>(d);
double i2d = static_cast<double>(i);
同时相关类(如父子关系)可以完成转换,但是如果父类指针本身指向父类对象,不存在安全问题,如果父类指针本身指向子类对象,则不存在安全问题;
class Base {};
class Derived:public Base{};
Base *b1 = new Base; //父类指针指向父类对象
Base *b2 = new Derived; //父类指针指向子类对象
Derived *b2d1 = static_cast<Derived *>(b1); //转换成功(不安全)
Derived *b2d2 = static_cast<Derived *>(b2); //转换成功(安全)
(2)dynamic_cast:只能进行对象指针之间的转;转换结果可以使指针也可以是引用;转换时会进行类型检查(static_cast不会进行检查);只有当父类指针指向一个子类对象,并且父类中包含了虚函数,转换才会成功,否则返回空指针,引用的话抛出异常。
class Base { virtual void dummy() {}; };
class Drived : public Base{};
Base *b1 = new Base;
Base *b2 = new Drived;//父类指针指向子类对象,且父类中包含虚函数
//转换结果为指针
Drived *b2d1 = dynamic_cast<Drived*>(b1);//转换失败(返回NULL)
Drived *b2d2 = dynamic_cast<Drived*>(b2);//转换成功
//转换结果为引用
Drived &b2d3 = dynamic_cast<Drived &>(*b1);//转换失败(抛出异常)
Drived &b2d4 = dynamic_cast<Drived &>(*b2);//转换成功
(3)const_cast:可以在转换过程中增加或删除const属性。一般情况下,无法将常量指针直接赋值给普通指针,但通过const_cast可以移除常量指针的const属性,从而实现const指针到非const指针的转换。
class Test{};
const Test *t1 = new Test;
Test *t2 = const_cast<Test *>(t1);
(4)reinterpret_cast:可以将一种类型的指针直接转换成另一种类型的指针,无论两个类型之间是否有继承关系。此外还可以吧一个指针转换为一个整数,也可以把一个整数转换成一个指针。另外还经常用在不同函数指针之间的转换。
class A{};
class B{};
A *a = new A;
B *b = reinterpret_cast<B *>(a); //转换成功
2.3简述静态全局变量的概念
(1)在全局变量前面加上static关键字就成为的静态全局变量。
(2)静态全局变量通常在源文件中声明定义,作用域为本文件,(而全局变量一般头文件声明,源文件定义,通过extern关键字,其作用域为整个工程。)
(3)如果在头文件中声明了静态全局变量,那么即使在没有初始化的情况下,也会被初始化为默认值,即相当于也被定义了,这时其他文件#include该头文件,相当于拷贝了一份,其初始值相同,后面各个文件中将互相不影响。
下面是静态全局变量的一个例子:
static int sgn;//声明定义静态全局变量
void increaseSG() { sgn++; }
int main(){
sgn = ;
cout << sgn << endl;
increaseSG();
cout << sgn << endl;
getchar();
return ;
}
C++程序设计基础(2)变量的更多相关文章
- C#程序设计基础——常量
C#程序设计基础——常量 常量是在编译时已知,并且在程序的生存期内不发生更改的不可变值.常量使用const修饰符进行声明. 常量必须在声明时初始化,且常量的类型必须为以下类型之一:sbyte/byte ...
- Oracle数据库之PL/SQL程序设计基础
PL/SQL程序设计基础 一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ ...
- 学而精计算机公共基础学习之路TEST2(程序设计基础)
程序设计基础 程序设计方法与风格 1.程序设计方法 程序设计: 指设计.编制.调试程序的方法和过程. 程序设计方法是研究问题求解如何进行系统构造的软件方法学.常用的程序设计方法有:结构化程序设计方法. ...
- 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!
今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...
- C语言程序设计基础知识点概括
C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...
- Java程序设计基础项目总结报告
Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现 ...
- 《C语言程序设计基础1》第二学期第一周学习总结
**<C语言程序设计基础1>第二学期第一周学习总结 一. 本周学习内容总结 一维数组,了解了一维数组的定义(定义一个数组,需要明确数组变量名,数组元素的类型和数组大小,即数组中元素的数量) ...
- 声明函数指针、回调函数、函数对象------c++程序设计基础、编程抽象与算法策略
声明函数指针 #include<iostream> using namespace std; double a(double aa) { return aa; } int main() { ...
- 内存布局------c++程序设计基础、编程抽象与算法策略
图中给出了在一个典型c++程序中如何组织内存的框架.程序中的指令(在底层都是按位存储的).全局变量.静态对象和只读常量往往被存储在静态去(static area)(第二个图中的数据段.代码段.值得注意 ...
- Java程序设计基础作业目录(作业笔记)
持续更新中............. Java程序设计基础笔记 • [目录] 我的大学笔记>>> 第1章 初识Java>>> 1.1.4 学生成绩等级流程图练习 1 ...
随机推荐
- react-native自定义原生组件
此文已由作者王翔授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 使用react-native的时候能够看到不少函数调用式的组件,像LinkIOS用来呼起url请求 Link ...
- shipyard
https://www.ivankrizsan.se/2016/07/10/managing-containers-shipyard/ kubernetes中文社区:https://www.kuber ...
- ubuntu14.04,安装docker(源代码管理工具)
一,安装docker: 1,安装curl:在shell中执行:sudo apt-get install curl 2,shell中执行:curl -sSL https://get.daocloud.i ...
- linux 常用端口【转载】
原文地址: http://blog.csdn.net/u013943420/article/details/65938696 一个计算机最多有65535个端口,端口不能重复.这65536个端口被分为两 ...
- 通过 js 修改 html 的文本内容或者样式
通过 js 修改 html 的文本内容 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...
- loj #6201. 「YNOI2016」掉进兔子洞
#6201. 「YNOI2016」掉进兔子洞 您正在打galgame,然后突然发现您今天太颓了,于是想写个数据结构题练练手: 给出一个长为 nnn 的序列 aaa. 有 mmm 个询问,每次询问三个区 ...
- 洛谷P4525 【模板】自适应辛普森法1
题面 传送门 题解 我似乎连积分都不太熟练→_→ 总之就是对于一个原函数,我们找一个二次函数来近似它,那么有 \[ \begin{aligned} \int_a^bf(x)dx &\appro ...
- bit、Byte、bps、Bps、pps、Gbps的单位的说明及换算
一.bit与Byte区别 1. bit(比特) 是电脑记忆体的最小单元,在二进制计算机中,每一比特代表0或1的数位信号. 2. Byte(单位字节) 一般表示存储介质大小的单位,数字.字母和特殊符号占 ...
- django' 前端 self.status.split(' ',1)[0], self.bytes_sent AttributeError: 'NoneType' object has no attribute 'split'
form 表单 post之后 ,重新定向当前页面的get请求 这是因为,form表单提交的时候,按钮在form表单里面
- 50行代码实现python计算器主要功能
实现功能:计算带有括号和四则运算的式子 3*( 4+ 50 )-(( 100 + 40 )*5/2- 3*2* 2/4+9)*((( 3 + 4)-4)-4) 基本思路:使用正则表达式提取出每一层 ...