面试6-----11 const和静态变量那些事儿
6 看看const和指针的那些事儿
const在int*左边
const在int*右边
const在int*两边------>请看代码注释
(1)代码
#include <stdio.h> int main()
{
const int x = ;//x为整形常量
int b = ;
int c = ; const int* a1 = &b;//const在int*的左边 用来修饰指针指向的变量即指针指向的为常量
int* const a2 = &b;//const在int*的右边 用来修饰指针本身 即指针本身是常量 所以不能修改本身
const int* const a3 = &b;//const出现在int*的两侧 所以不仅本身不能修改 指向的内容也不可以修改 //x = 2;//这里报错 左值为常量 a1 = &c;
//*a1 = 1;//a1指向的内容不可以改变 //a2 = &c;
//*a2 = 1;//const在int*的右边 用来修饰指针本身 即指针本身是常量 所以不能修改本身 //a3 = &c;
//*a3 = 1;
return ;
}
7 说明const与#define的特点与区别
(1)分别看看const和#define
#define a 10
int b;
b = *a;
#define:
a:编译器最开始的时候就会将#define a以后所有的代码中的a全部替换为10,然后进行编译
b:生命周期止于编译器,存在于程序的代码段,实际上就是一个常数
c:没有数据类型
const:
a:数据段,并分配了空间
b:有数据类型
c:可以进行安全性检查
8 c++中const有什么作用(至少三个)
(1)const定义的常量,编译器可以对其进行数据类型的安全检查
(2)const修饰函数形式参数 ,输入参数作为用户自定义类型和抽象数据类型是,将值传递改为const &传递可以提高效率
void func(A a)
void func(A const &a)
a:第一个函数会产生临时对象用于复制参数a,临时对象的构造 析构等都将消耗事件
b:引用传递不需要产生临时对象,但是只用a会改变a,所以加上const修饰
(3)const修饰函数的返回值:比如指针传递的函数返回值加const,返回就不能被直接修改,而且返回值只能被赋值给加const修改的同类型指针
const char *getchar(void){}
char *ch = Getchar();//error
const char *ch=Getchar();//correct
(4)const修饰类的成员函数,任何不修改数据成员的函数都应该加上const修饰(这样如果不小心修改了成员会报错提醒我们)
9 static的作用(至少两个)
(1) 函数体内,被申明为静态的变量,函数被调用的过程中都不会改变
(2)在整个模块内(函数体外),被申明的静态变量可以被模块内所有的函数访问,但是不能被模块外的访问,本地全局变量
(3)模块内,静态函数只能被这一模块内的其他函数调用。也就是这个函数被限制在声明它的模块的本地范围内使用(当前文件)
10static全局变量与普通的全局变量区别(c++)
(1)存储方式都一样------>静态存储方式
(2)static全局:限制了作用域,只能是定义变量的当前文件有效(如果源程序有多个文件)
普通全局:在各个原文件都有效
(3)static函数与普通函数作用域不同:
static函数:作用域本文件
总之:
(1) static全局与普通全局:
static全局只初始化一次,防止其他文件使用
(2)static局部和不同局部:
static局部变量初始化一次,下一次依据上一次结果值
(3)static函数与普通函数:
static函数在内存中只有一份,普通函数每次调用维持一份复制品
11 c++类的静态成员
#include <iostream>
using namespace std;
class widget
{
public:
widget()
{
count++;
}
~widget()
{
--count;
}
static int num()
{
return count;
}
private:
static int count;
};
int widget::count = ; int main()
{
widget x, y;
cout << "the num is" << widget::num() << endl;
if (widget::num() > )
{
widget x, y, z;
cout << "the num is" << widget::num() << endl;
}
widget z;
cout << "the num is" << widget::num() << endl;
return ;
}
(1)首先类中的静态成员或者方法不属于类的实例
(2)count的值就是类widget实例的个数
(3)结果
25行中两个实例下x,y然后29行3个实例,但是出了代码块(也就是括号)就没有了,最后一个实例所以3个。
好了,今天的这部分任务结束(呜呜呜,今天电脑好卡!!!!!!),小伙伴加油
最新文章
- 用C语言写的双色球
- Http 1.1协议
- java网络编程之TCP实例
- linux c/c++ IP字符串转换成可比较大小的数字
- hdu 1754 I Hate It (splay tree伸展树)
- cygwin使用
- HDU 5828 Rikka with Sequence
- 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM、二进制和源码安装
- JDBC结果集rs.next()注意事项
- dojo省份地市级联之地市封装类(二)
- 笔记:Maven 私服 Nexus 权限控制
- [LeetCode] Kth Smallest Number in Multiplication Table 乘法表中的第K小的数字
- h5手机点击返回键,刷新页面
- flask 重定向到上一个页面,referrer、next参数
- 执行了‘“npm install mysql";
- (16/24) webpack打包后的调试方法
- 20145234黄斐《Java程序设计》课程总结
- angularJS1笔记-(10)-自定义指令(templateUrl属性)
- UIApplication概述
- 教你一招解决浏览器兼容问题(PostCSS的使用)