栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > C/C++/C#

C++随心记(四)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++随心记(四)

1. 指针和引用的区别,如何实现

        1. 指针是一个实体;引用是某变量的别名

        2. 引用在定义时必须初始化,一旦与某个变量绑定后不可改变;指针变量可变

        3. 引用不能为空;指针可以为空(指针一般指某块内存的地址,因此可以为空)

        3. 自增(++),自减(--)的含义不一样

        4. sizeof 引用得到的是所指向的变量(对象)的大小;sizeof 指针得到的是指针本身(所指向的变量或对象的地址)的大小

        5. 引用底层是用指针实现的,引用其实是指针的一种语法糖。主流编译器都会选择将C++中的引用解释为“const指针”(实现);引用本身存放的是引用对象的地址,所占的内存大小就是指针的大小。

        6. 安全检查:由3可知,引用由编译器保证初始化,不像指针在使用的时候需要判断是否为空。

2. static 关键字的用法和作用

C++中初始化一共有两种用法,第一种:面向过程;第二种:面向对象。前者应用于普通变量和函数,用于构建静态全局变量、静态局部变量、静态函数;后者主要说明static在类中的作用,用于构建静态成员变量、静态成员函数。

2.1 静态成员变量

        a. 静态成员变量属于类,不独属于某个具体由对应类定义的具体对象,在对象间共享,即无论类的对象被定义了多少个,静态成员变量只分配一次内存,且不占用对象的内存,由所有对象共享,可以更新。

        b. 静态成员变量在编译时 + 全局存储区分配内存;静态成员变量在编译过程中的初始化时分配内存;non - const 静态成员变量必须初始化,且只能在类外进行;const 静态成员变量必须声明且初始化;初始化的时候可以赋初值,不赋值默认为0。

        c. 使用过程遵循 public,protected,private访问规则。

        d. sizeof 运算符不会计算 静态成员变量。

#include 
class Myclass
{
public:
	Myclass(int a, int b, int c);
	void GetSum();
private:
	int a, b, c;
	static int Sum;//声明静态数据成员
};

int Myclass::Sum=0;    //定义并初始化静态数据成员

2.2 静态成员函数

        a. 静态成员函数同样属于类,不独属于某一个对象

        b. 静态成员函数仅可以访问静态成员变量和其它静态成员函数;非静态成员函数可以任意访问静态成员变量和函数;

        c. 相比于普通函数,静态成员函数不具有隐含的 this 指针,因此无法访问类对象的非静态成员。

2.3 静态全局变量

// 文件A
#include  

static int n; // 定义静态全局变量,并自动初始化为0

void main()
{
	n = 20;
	cout << n << endl;
} 

// 文件B
#include  
extern int n;

int func()
{
	n ++ ; // 企图访问文件A中的全局静态变量 n !
	cout << n << endl;
    return 0;
} 

上述代码能够通过编译,但运行时报错。因此得出如下结论:

        a. 定义:在全局变量前,增加 static 关键字即可完成全局静态变量的定义。

        b. 存储在内存中的位置:静态存储区,在整个程序运行期间一直存在。

        c. 初始化:程序执行到变量声明处时初始化,默认初始化为0,且只会初始化一次。

        d. 作用域:全局静态变量从定义开始,一直到文件结尾都可见;在文件之外不可见。

2.4 静态局部变量

        a. 在局部变量之前,增加 static 关键字即可局部静态变量的定义。

        b. 存储在内存中的位置:静态存储区。

        c. 初始化:程序执行到变量声明处时初始化,默认初始化为0,且只会初始化一次

        d. 作用域:作用域和局部变量一样,仍然是局部作用域,即从变量声明开始,到函数或者语句块结束的位置。但是!当静态局部变量离开作用域后,并不会销毁,仍然驻留在内存中,此时不能对其进行访问,直到再次调用函数(值维持上一次调用后的结果)。

void funcA();
void funcA()
{
	static int n = 0;
	std::cout << n << std::endl;
	n ++ ;
}

int main()
{
	funcA(); // 0
	funcA(); // 1
	funcA(); // 2
    return 0;
}

2.5 静态函数

a. 在普通的函数返回类型前增加 static 关键字即可声明、定义。

b. 作用域:仅在静态函数声明的文件中可见

3. c++内存分配

c ++ 将程序使用到的内存划分为5个区域:

地址自上而下看——由高到底,所以栈在内存分配时,地址由高到低;堆在内存分配时,地址由低到高。

图转载自:C语言:内存分配---栈区、堆区、全局区、常量区和代码区_根号五的博客-CSDN博客_c语言内存堆区

3.1 栈区:由编译器控制内存的分配与释放,多用于存放函数的参数 + 局部变量的值等,其存储空间是连续的;函数调用结束后函数的返回值也会存在这里;释放顺序和一般栈的概念很像,遵循先进后出原则。

3.2 堆区:一般由程序猿控制内存的申请、分配与释放(malloc / new -- free / delete);如果申请的内存不手动释放,在程序结束时可能会由OS释放,而那些仍然不能释放的内存可能会造成内存泄漏;存储空间不一定连续,即连续声明的指针变量,指向的两块内存不一定连续。

3.3 全局 / 静态存储区:该区域由.bss段 和 .data段组成。全局 / 局部静态变量和全局变量的存储区域,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被OS释放;

(该内容真实性待定)值得注意的是,初始化的全局变量和静态变量存储在一块区域,即 .data,程序结束后由OS释放。

未初始化的全局变量和未初始化的静态变量 / 初始化为0的全局变量和初始化为0的静态变量 存储在相邻的另一块区域,即 .bss 程序结束后由OS释放。

3.4 文字常量区:不允许修改的常量的存储区域(可通过非正当手段修改)。程序结束后由OS释放。

3.5 程序代码区:存放函数体内的二进制代码,由OS管理。

3.6 代码示例

int a = 0;  // 全局变量,全局初始化区

static int b = 0; // 全局静态变量,全局初始化区

char * p1;    // 全局未初始化区
​
int main() {
    int  a;               // 栈区

    char s[] = "abc";     // "abc/0"在常量区,s在栈中

    char *p1;             // 未初始化局部变量,栈
​
    char *p2 = "123456";  // "123456/0"在常量区, p3在栈区
​
    static int c = 0;     // 静态局部变量,全局初始化区

    p1 =  (char *)malloc(10);  // 申请、分配的10和20字节的区域在堆区
    p2  = (char *)malloc(20);       
}

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1037266.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号