C++ 中的临时变量,成员变量,全局变量,Static关键字,new关键字,const关键字

临时变量

C++ 中的临时变量,从字面上看,临时变量就是临时创建的变量,但是实际上并没有那么简单,在C++中,真正意义的临时变量是不会在代码中显式出现的,按照这种定义,将临时变量和一个短命的局部变量区分开来;
临时变量通常在函数传递发生类型转换以及函数返回值的时候被创建,临时变量是在栈上被创建的,当它完成值传递后,就会被销毁,而使用指针进行值传递,只需要传递地址,不会创建临时变量,因此会说使用指针效率更高,而并不是指针本身占用的内存更小;

成员变量

成员变量是相对于类而言的,作为类中的成员而得名,类可以看做事一种数据类型,是一个包含了成员变量和成员函数的集合体;
类的成员变量和普通变量一样,也有数据类型和名称,占用固定长度的内存空间,主要用来描述对象的具体特征,也称为成员属性,属性一般仅供类的内部使用,在进程运行时,成员变量存储在栈区;但是,在定义类的时候不能对成员变量进行赋值,类只是一种数据类型,并不占用内存空间,但是变量的值需要内存来存储;

全局变量&局部变量

局部变量
定义在函数的内部,在其他函数的语句中是不可见的,通常无法访问。因此不同的函数中的变量可以拥有相同的名称;只有在定义的函数正在执行的时候,局部变量才会存在,这就是局部变量的生存期。当函数开始时,它的形参变量和它定义的任何局部变量都将在内存中创建,当函数结束时,它们被销毁。这意味着存储在函数形参或局部变量中的任何值在调用不同函数之后都会丢失。

全局变量
全局变量是程序中定义在所有函数(包括 main 函数)之外的任何变量。全局变量的作用域是程序从变量定义到整个程序结束的部分。这意味着全局变量可以被所有定义在全局变量之后的函数访问。
虽然全局变量非常简易好用,但是应该限制对它们的使用,在创建较大的工程的时候,会导致一些问题:
调试困难:任何语句都能改变全局变量的值,当出现错误时,在代码量足够多的情况下,会非常困难;
修改困难:一些函数依赖于全局变量,如果在不同的程序中使用,会使得整个程序的适用性差。
可读性差:由于全局变量会收到其他语句的修改,因此要了解一个函数的过程时,需要通读其他整个部分;

static

总的来说
(1)在修饰变量的时候,static修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
(2)Static修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其他文件中访问,即便是extern外部声明也不可以。
(3)static修饰一个函数,则这个函数只能在本文件中调用,不能被其他文件调用。static修饰的变量存放在全局数据区的静态变量区,包括全局静态变量和局部静态变量,都在全局数据区分配内存。初始化的时候自动初始化为0。
(4)不想被释放的时候,可以使用static修饰。比如修饰函数中存放在栈空间的数组。如果不想让这个数组在函数调用结束的时候被释放,可以使用static修饰。
(5)考虑到数据安全性(当程序想要使用全局变量的时候应该优先考虑使用static)
静态全局变量有以下特点
(1)静态变量都在全局数据区分配内存,包括后面将要提到的静态局部变量;
(2)未经初始化的静态全局变量会被程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为 0);
(3)静态全局变量在声明它的整个文件都是可见的,而在文件之外是不可见的。
优点:静态全局变量不能被其它文件所用;其它文件中可以定义相同名字的变量,不会发生冲突。

全局变量和全局静态变量的区别
1)全局变量是不显式用 static 修饰的全局变量,全局变量默认是有外部链接性的,作用域是整个工程,在一个文件内定义的全局变量,在另一个文件中,通过 extern 全局变量名的声明,就可以使用全局变量。
2)全局静态变量是显式用 static 修饰的全局变量,作用域是声明此变量所在的文件,其他的文件即使用 extern 声明也不能使用。

静态局部变量有以下特点
(1)该变量在全局数据区分配内存;
(2)静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;
(3)静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为 0;
(4)它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

new 关键字

基本用法
(1)C++通过new关键字进行动态内存分配;
(2)new开辟的空间存储在堆上,而我们定义的变量存储在栈上;
(3)new分配的空间使用delete释放,使用delete关键字;

new实例化对象
(类)A * (对象)B = new (类)A;
delete B;
如果不使用new,直接用类定义申明:
(类)A (对象)B
此种方式是普通创建方式,使用完后不需要手动释放,在类的析构函数中自动执行。但是new申请的对象,需要自行使用delete释放,否则会造成内存泄露。
对于有构造函数的类,会通过构造函数函数进行初始化;如果没有构造函数,不加括号的new只分配内存空间,不会进行内存的初始化,而加了括号则会在分配内存的同时初始化为0。

需要使用new的情景
(1)申请对象数量不确定时
(2)需要空间较大时
(3)动态空间使用new,非动态不用
(4)需要在函数中返回对象的指针
(5)但太频繁的调用场景,并不适用new

总结
new关键字在于动态内存管理,管理员可以自主操控内存,使得整个程序更加轻量化,代码运行效率更高,同时动态数组也应用于很多场景。

const

const名为常量限定符,用来限定特定变量,以通知编译器该变量时不能修改的。使用const,可以避免函数中对某些不能修改的变量造成改动。

用法
(1)const修饰基本数据类型

const int a = 1;

(2)const应用函数中

用于修饰函数参数和返回值,参数const通常用于参数为指针或者引用的情况,根据同样的用法,const保护函数的参数或者返回值原本指向或引用的内容;

(3)const在类中的用法
(4)const修饰类对象,定义常量对象

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值