欢迎关注
0voice · GitHub
1
、
C++
中内存分配情况
栈:由编译器管理分配和回收,存放局部变ᰁ和函数参数。
堆:由程序员管理,需要⼿动
new malloc delete free
进⾏分配和回收,空间较⼤,但可能会出现内存泄漏和空闲
碎⽚的情况。
全局
/
静态存储区:分为初始化和未初始化两个相邻区域,存储初始化和未初始化的全局变ᰁ和静态变ᰁ。
常ᰁ存储区:存储常ᰁ,⼀般不允许修改。
代码区:存放程序的⼆进制代码。
2
、
C++
中的指针参数传递和引⽤参数传递
指针参数传递本质上是值传递
,它所传递的是⼀个地址值。值传递过程中,被调函数的形式参数作为被调函数的局
部变ᰁ处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从⽽形成了实参的⼀个副本(替身)。
值传递的特点是,被调函数对形式参数的任何操作都是作为局部变ᰁ进⾏的,不会影响主调函数的实参变ᰁ的值
(形参指针变了,实参指针不会变)。
引⽤参数传递过程中,被调函数的形式参数也作为局部变ᰁ在栈中开辟了内存空间,但是这时存放的是由主调函数
放进来的
实参变ᰁ的地址
。被调函数对形参(本体)的任何操作都被处理成间接寻址,即通过栈中存放的地址访问
主调函数中的实参变ᰁ(根据别名找到主调函数中的本体)。因此,被调函数对形参的任何操作都会影响主调函数
中的实参变ᰁ。
引⽤传递和指针传递是不同的
,虽然他们都是在被调函数栈空间上的⼀个局部变ᰁ,但是任何对于引⽤参数的处理
都会通过⼀个间接寻址的⽅式操作到主调函数中的相关变ᰁ。⽽对于指针传递的参数,如果改变被调函数中的指针
地址,它将应⽤不到主调函数的相关变ᰁ。如果想通过指针参数传递来改变主调函数中的相关变ᰁ(地址),那就
得使⽤指向指针的指针或者指针引⽤。
从编译的⻆度来讲
,程序在编译时分别将指针和引⽤添加到符号表上,符号表中记录的是变ᰁ名及变ᰁ所对应地
址。指针变ᰁ在符号表上对应的地址值为指针变ᰁ的地址值,⽽引⽤在符号表上对应的地址值为引⽤对象的地址值
(与实参名字不同,地址相同)。符号表⽣成之后就不会再改,因此指针可以改变其指向的对象(指针变ᰁ中的值
可以改),⽽引⽤对象则不能修改。
3
、
C++
中
const
和
static
关键字(定义,⽤途)
static
作⽤:控制变ᰁ的存储⽅式和可⻅性。
作⽤⼀:修饰局部变ᰁ
:⼀般情况下,对于局部变ᰁ在程序中是存放在栈区的,并且局部的⽣命周期在包含语句块
执⾏结束时便结束了。但是如果⽤
static
关键字修饰的话,该变ᰁ便会存放在静态数据区,其⽣命周期会⼀直延续
到整个程序执⾏结束。但是要注意的是,虽然⽤
static
对局部变ᰁ进⾏修饰之后,其⽣命周期以及存储空间发⽣了
变化,但其作⽤域并没有改变,作⽤域还是限制在其语句块。
作⽤⼆:修饰全部变ᰁ
:对于⼀个全局变ᰁ,它既可以在本⽂件中被访问到,也可以在同⼀个⼯程中其它源⽂件被
访问
(
添加
extern
进⾏声明即可
)
。⽤
static
对全局变ᰁ进⾏修饰改变了其作⽤域范围,由原来的整个⼯程可⻅变成
了本⽂件可⻅。
作⽤三:修饰函数
:⽤
static
修饰函数,情况和修饰全局变ᰁ类似,也是改变了函数的作⽤域。
作⽤四:修饰类
:如果
C++
中对类中的某个函数⽤
static
修饰,则表示该函数属于⼀个类⽽不是属于此类的任何
特定对象;如果对类中的某个变ᰁ进⾏
static
修饰,则表示该变ᰁ以及所有的对象所有,存储空间中只存在⼀个副
本,可以通过;类和对象去调⽤。
(补充
:静态⾮常ᰁ数据成员,其只能在类外定义和初始化,在类内仅是声明⽽已。)
作⽤五:类成员
/
类函数声明
static
函数体内
static
变ᰁ的作⽤范围为该函数体,不同于
auto
变ᰁ,该变ᰁ的内存只被分配⼀次,因此其值在下
次调⽤时仍维持上次的值;
在模块内的
static
全局变ᰁ可以被模块内所⽤函数访问,但不能被模块外其它函数访问;
在模块内的
static
函数只可被这⼀模块内的其它函数调⽤,这个函数的使⽤范围被限制在声明它的模块内;
在类中的
static
成员变ᰁ属于整个类所拥有,对类的所有对象只有⼀份拷⻉;
在类中的
static
成员函数属于整个类所拥有,这个函数不接收
this
指针,因⽽只能访问类的
static
成员变
4。 static 类对象必须要在类外进⾏初始化,
static
修饰的变ᰁ先于对象存在,所以
static
修饰的变ᰁ要在类外初
始化;
由于
static
修饰的类成员属于类,不属于对象,因此
static
类成员函数是没有
this
指针,
this
指针是指向本
对象的指针,正因为没有
this
指针,所以
static
类成员函数不能访问⾮
static
的类成员,只能访问
static
修饰
的类成员;
static
成员函数不能被
virtual
修饰,
static
成员不属于任何对象或实例,所以加上
virtual
没有任何实际意
义;静态成员函数没有
this
指针,虚函数的实现是为每⼀个对象分配⼀个
vptr
指针,⽽
vptr
是通过
this
指
针调⽤的,所以不能为
virtual
;虚函数的调⽤关系,
this->vptr->ctable->virtual function
。
C ++
中的
const
类成员函数(⽤法和意义)
常ᰁ对象可以调⽤类中的
const
成员函数,但不能调⽤⾮
const
成员函数; (原因:对象调⽤成员函数时,在形
参列表的最前⾯加⼀个形参
this
,但这是隐式的。
this
指针是默认指向调⽤函数的当前对象的,所以,很⾃然,
this
是⼀个常ᰁ指针
test * const
,因为不可以修改
this
指针代表的地址。但当成员函数的参数列表(即⼩括号)
后加了
const
关键字(
void print() const;
),此成员函数为常ᰁ成员函数,此时它的隐式
this
形参为
const test *
const
,即不可以通过
this
指针来改变指向对象的值。
⾮常ᰁ对象可以调⽤类中的
const
成员函数,也可以调⽤⾮
const
成员函数。
5
、
C
和
C++
区别 (函数
/
类
/struct/class
)
⾸先,
C
和
C++
在基本语句上没有过⼤的区别。
C++
有新增的
语法和关键字
,语法的区别有头⽂件的不同和命名空间的不同,
C++
允许我们⾃⼰定义⾃⼰的空间,
C
中不可以。关键字⽅⾯⽐如
C++
与
C
动态管理内存的⽅式不同,
C++
中在
malloc
和
free
的基础上增加了
new
和
delete
,⽽且
C++
中在指针的基础上增加了引⽤的概念,关键字例如
C++
中还增加了
auto
,
explicit
体现显示
和隐式转换上的概念要求,还有
dynamic_cast
增加类型安全⽅⾯的内容。
函数⽅⾯
C++
中有᯿载和虚函数的概念
:
C++
⽀持函数᯿载⽽
C
不⽀持,是因为
C++
函数的名字修饰与
C
不同,
C++
函数名字的修饰会将参数加在后⾯,例如,
int func(int,double)
经过名字修饰之后会变成
_func_int_double
,
⽽
C
中则会变成
_func
,所以
C++
中会⽀持不同参数调⽤不同函数。
C++
还有虚函数概念,⽤以实现多态。
类⽅⾯,
C
的
struct
和
C++
的类也有很⼤不同
:
C++
中的
struct
不仅可以有成员变ᰁ还可以成员函数,⽽且对于
struct
增加了权限访问的概念,
struct
的默认成员访问权限和默认继承权限都是
public
,
C++
中除了
struct
还有
class
表示类,
struct
和
class
还有⼀点不同在于
class
的默认成员访问权限和默认继承权限都是
private
。
C++
中增加了模板还᯿⽤代码,提供了更加强⼤的
STL
标准库。
最后补充⼀点就是
C
是⼀种结构化的语⾔,᯿点在于算法和数据结构。
C
程序的设计⾸先考虑的是如何通过⼀个代
码,⼀个过程对输⼊进⾏运算处理输出。⽽
C++
⾸先考虑的是如何构造⼀个对象模型,让这个模型能够契合与之对
应的问题领域,这样就能通过获取对象的状态信息得到输出。
C
的
struct
更适合看成是⼀个数据结构的实现体,⽽
C++
的
class
更适合看成是⼀个对象的实现体