c++基础复习(1)

复习点:一、虚拟内存   二、static关键字    三、const关键字(用法和define的区别)   四、mutable关键字

虚拟内存

虚拟内存是内存管理的一种方式,主要是为了解决“大作业”无法同时装入内存的问题。它将多个物理内存碎片和部分磁盘空间重定向为连续的地址空间,以此让程序认为自己拥有连续的可用内存,当物理内存不足时,操作系统会根据页面置换算法将程序需要的数据交换到内存中。

虚拟地址空间:在程序运行时,操作系统(linux系统)会为每个进程分配一个4g的虚拟地址空间,其中0-3g为用户空间,3-4g为内核空间

而3-4g的内核空间被所有进程所公用。

名称存储内容
局部变量、函数函数、返回地址等
动态分配的内存
BSS段未初始化化或初始值为0的全局变量和静态局部变量(可读可写)
数据段已初始化且初始值非0的全局变量和静态局部变量(可读可写)
代码段可执行代码、字符串字面值、只读变量(可读不可写可执行)

static关键字

一、C语言中使用方式:

1、静态局部变量

在局部变量前加关键字static,全局变量就会称为静态局部变量。和普通的变量不同的地方在于:

(1)内存中的存储位置不同:普通变量在内存中的位置是栈上,而静态局部变量存放在静态存储区。

(2)生存周期不同:普通变量在用完就会被自动释放掉,而静态局部变量则是在程序结束时被释放。

(3)不初始化的情况下,初始值不同:普通变量的在不初始化的情况的初始值为随机值,而静态局部变量的初始值则为0。

(4)静态局部变量在初次调用时出初始化且只初始化一次(再次初始化不会对值产生影响)。

2、静态全局变量(内部变量)

当在全局变量前加static关键字时,该变量为静态全局变量,和一般的全局变量一样,静态全局变量存储在静态存储区。不同的是静态全局变量不能被其他文件访问,即内部变量。(一般的全局变量在其他文件中加extern关键字就可以使用。)

3、静态函数

在函数声明时加static,该函数为静态函数(内部函数),即无法被其他文件访问。

二、c++中的使用方式

1、类的静态数据成员

在类中的数据成员前加static关键字,该数据成员为该类的静态数据成员。除了遵循public/protected/private访问规则之外,静态成员变量还具有以下特点:

(1)必须在类内声明,类外初始化。

(2)可以使用<类名>::var在类外直接使用,也可以通过对象使用。

(3)静态数据成员被类的所有对象所共享,包括该类的派生类的对象。

(4)静态数据成员的类型可以是所属类的类型(在类内只是声明),而普通的数据成员则不可以(无法为该对象分配空间)。

(5)静态数据成员的值在const成员函数中可以被合法的改变。

2、类的静态成员函数

在类中成员函数的前加static关键字,该成员函数为该类的静态成员函数。

(1)静态成员函数的地址可用普通的函数指针存储,而普通的成员函数地址需要使用类的成员函数指针来存储。

(2)静态成员函数不可以调用类的非静态成员。因为静态成员函数不含this指针。

(3)静态成员函数不可以同时声明为virtual、const、volatile函数。

(4)静态成员函数无须创建对象就可以使用。

const关键字

技巧:忽略变量的类型,直接看const后面修饰的是什么。

C语言中:

1、修饰常量

const int temp1;  --> const temp1
int const temp2;  --> const temp2
//temp1、temp2为常量,不可变

2、修饰指针(不影响指向的内容,即变量本身可以变。)

const int *ptr;  -->const *ptr 
int const *ptr;  -->const *ptr //*ptr为常量,即不能通过指针修改变量的值。
int* const ptr;  -->const ptr  //ptr为常量,即指针不能指向其他变量。
const int* const ptr;  -->const * (const ptr) //不能通过指针修改值,指针也不能指向其他变量

3、在函数声明中使用

(1)修饰函数的返回值

(2)修饰函数的参数

c++中:

1、修饰成员变量

const修饰的成员变量不能被修改,同时只能在成员初始化列表中初始化,因为常量只能被初始化,不能被赋值。

赋值时使用新值覆盖旧值,构造函数时先为其开辟空间然后为其赋值;而在成员初始化列表开辟空间和初始化是同时完成的。

class Test
{
public:
	int _x;
	const int _y=10;
	Test(int x,int y)
		:_y(y)
	{
		_x = x;
	}
};

2、修饰成员函数

const成员函数表示该成员函数不能修改类对象中的任何非const成员变量,一般const写在函数的后面。

如果一个成员函数不会修改成员变量,那么可以将其声明为const。注意:const是函数类型的组成部分,因此在函数定义的部分也要带const关键字。

const关键字可以用于对重载的区分。如果非const对象调用该方法,编译器会选择非const成员函数。

3、修饰类对象

const修饰类对象是常对象,该对象中的任何成员变量都不能被修改。为了防止成员变量在成员函数中被修改,所以c++同时规定,const修饰的对象即常对象只能调用的类的常成员函数。

4、修饰引用

const修饰的引用,被称为常引用。常引用所引用的对象不能被更新。

const 常量和 define 宏定义的区别:

1、处理阶段不同。const常量是在编译阶段使用,而define宏则是在预处理阶段被替换。

2 、类型和安全检查不同。define宏没有类型,不做检查,仅仅只是字符替换,没有类型安全检查,并且在字符替换是可能会出现意料不到的错误。而const常量有明确的类型,在编译阶段会进行类型检查。

3、存储方式不同。define是字符替换,有多少地方使用就会替换多少次,不会分配内存。编译器通常不会为const常量分配空间,只是将他们保存在符号表中,使他们称为编译期间的一个常量,没有读取内存操作。

mutable关键字

在C++中,mutable是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中,甚至结构体变量或者类对象为const,其mutable成员也可以被修改。mutable在类中只能够修饰非静态数据成员

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值