注:读《程序员面试笔记》笔记总结

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)变量的更多相关文章

  1. C#程序设计基础——常量

    C#程序设计基础——常量 常量是在编译时已知,并且在程序的生存期内不发生更改的不可变值.常量使用const修饰符进行声明. 常量必须在声明时初始化,且常量的类型必须为以下类型之一:sbyte/byte ...

  2. Oracle数据库之PL/SQL程序设计基础

    PL/SQL程序设计基础 一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ ...

  3. 学而精计算机公共基础学习之路TEST2(程序设计基础)

    程序设计基础 程序设计方法与风格 1.程序设计方法 程序设计: 指设计.编制.调试程序的方法和过程. 程序设计方法是研究问题求解如何进行系统构造的软件方法学.常用的程序设计方法有:结构化程序设计方法. ...

  4. 谈谈书本《c#物联网程序设计基础》中的技术瑕疵,如果你将要读本书,请进来看看!

    今天去书店看到一本名为<c#物联网程序设计基础>的书,对物联网感兴趣的我抓起来就看,书中的项目都是上位机开发项目,较简单,如果物联网开发只是这样,看起来我做物联网开发也是绰绰有余.这边书我 ...

  5. C语言程序设计基础知识点概括

    C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...

  6. Java程序设计基础项目总结报告

    Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现 ...

  7. 《C语言程序设计基础1》第二学期第一周学习总结

    **<C语言程序设计基础1>第二学期第一周学习总结 一. 本周学习内容总结 一维数组,了解了一维数组的定义(定义一个数组,需要明确数组变量名,数组元素的类型和数组大小,即数组中元素的数量) ...

  8. 声明函数指针、回调函数、函数对象------c++程序设计基础、编程抽象与算法策略

    声明函数指针 #include<iostream> using namespace std; double a(double aa) { return aa; } int main() { ...

  9. 内存布局------c++程序设计基础、编程抽象与算法策略

    图中给出了在一个典型c++程序中如何组织内存的框架.程序中的指令(在底层都是按位存储的).全局变量.静态对象和只读常量往往被存储在静态去(static area)(第二个图中的数据段.代码段.值得注意 ...

  10. Java程序设计基础作业目录(作业笔记)

    持续更新中............. Java程序设计基础笔记 • [目录] 我的大学笔记>>> 第1章 初识Java>>> 1.1.4 学生成绩等级流程图练习 1 ...

随机推荐

  1. (二)RabbitMQ使用笔记

    1.RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 官网:http://www.rabbitmq.c ...

  2. 1、认识Socket

    专业术语定义:(不易理解浏览大体意思即可) 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. 建立网络通信连接至少要一对端口号(socket).socket本 ...

  3. CENTOS7 使用 Nginx + Uwsgi 部署 Django 项目

    写在前面的话 最近总是见到有新学 Django 的朋友在部署自己的项目到 Linux 上面的时候运行不起来,所以就动手写了这篇博客. 对于不会搭建 Python 3 环境的朋友可以参考前面的博客[CE ...

  4. iOS开发-导出profile文件

    1.登陆苹果开发者网站 苹果开发者中心,点击 Certificates, Identifiers & Profiles 2.导出Provisioning Profiles 2.1 点击右上脚加 ...

  5. Python 集合set()添加删除、交集、并集、集合操作详解

    集合:一个集合中,任何两个元素都认为是不相同的,即每个元素只能出现一次.每个元素的地位都是相同的,元素之间是无序的. 创建集合set python set类是在python的sets模块中,大家现在使 ...

  6. pg_basebackup命令解析

    pg_basebackup命令首先解析输入的参数,再调用BaseBackup()函数进行备份处理. 在BaseBackup()函数内部,会首先传送WAL日志(如果指定了-x选项的话).随后依次遍历所有 ...

  7. 微信支付的SDK曝出重大漏洞(XXE漏洞)

    一.背景 昨天(2018-07-04)微信支付的SDK曝出重大漏洞(XXE漏洞),通过该漏洞,攻击者可以获取服务器中目录结构.文件内容,如代码.各种私钥等.获取这些信息以后,攻击者便可以为所欲为,其中 ...

  8. Codeforces Round #162 (Div. 2) A~D 题解

    A. Colorful Stones (Simplified Edition) time limit per test 2 seconds memory limit per test 256 mega ...

  9. swift pod 第三方库异常的处理

    Xcode8—Swift开发使用Cocoapods引入第三方库异常处理方法 参考:  http://www.jianshu.com/p/23f13be525a0 //podfile文件如下 platf ...

  10. 01、前端需要注意哪些SEO?

    1.前端需要注意哪些SEO? 1)设置网站TDK标签的设置 2)图片img标签必须加上alt属性 3)h1~h6标签合理使用 4)a标签增加rel="nofollow" 5) 安装 ...