C++ new和new[]的区别?
1。C++new和new[]的区别?2。虚函数的实现?3。解释下继承类的内存模型?以上是网上看到的几个面试题,小弟想了解下~~...
1。C++ new和new[]的区别?
2。虚函数的实现?
3。解释下继承类的内存模型?
以上是网上看到的几个面试题,小弟想了解下~~ 展开
2。虚函数的实现?
3。解释下继承类的内存模型?
以上是网上看到的几个面试题,小弟想了解下~~ 展开
4个回答
展开全部
auto:用来声明自动变量。它是存储类型标识符,表明变量(自动)具有本地范围,块范围的变量声明(如for循环体内的变量声明)默认为auto存储类型。
其实大多普通声明方式声明的变量都是auto变量,他们不需要明确指定auto关键字,默认就是auto的了。auto变量在离开作用域是会变程序自动释放,不会发生内存溢出情况(除了包含指针的类)。使用auto变量的优势是不需要考虑去变量是否被释放,比较安全吧。
new:new是用来在堆上申请内存地址的关键字,他产生的变量不会自动释放,除非delete来手动释放,或者程序结束时由操作系统释放,使用new的优势是内存使用比较灵活,理论可以申请任意大小的内存区块(实际与操作系统有关),但这很容易产生问题,一不小心忘记释放对象,特别是在频繁调用的函数内创建的对象忘记释放时,会产生内存溢出,严重时导致程序出错,系统崩溃。new一般都是在类的定义中使用,结合delete可以使包含new出来对象的类也具有自带变量功能,这样就继承了两种方式的优势。
--------------------------------------------------------------
另外,最新的C++标准更新了auto关键字的功能
除了具有原有的含义外,还增加了一种类似其他高级语言的型别推导特性
使用auto来代替变量的类型,
前提是被明确类型的初始化变量初始化的,可以使用auto关键字
比如int i=10; auto a = i; //这样a也是int类型了
这在使用一些模板类的时候,对于减少冗赘的代码也很有用
---------------------------------------------------------------
另外一个题外话:auto的对应类型不是使用new出来的变量,而是static变量
static变量是程序接收的时候才释放对象的,但它不需要手动释放。
static如果在一个函数内申明,这每次进入这个函数时,还是使用第一次声明的变量,并且还保存的上次使用的值(auto变量这时函数结束是即释放了,再次调用这个函数是,有重新定义了一个新的变量)
static变量如果在结构和类中使用,这结构或类定义的一切对象,都将共享唯一static变量。
其实大多普通声明方式声明的变量都是auto变量,他们不需要明确指定auto关键字,默认就是auto的了。auto变量在离开作用域是会变程序自动释放,不会发生内存溢出情况(除了包含指针的类)。使用auto变量的优势是不需要考虑去变量是否被释放,比较安全吧。
new:new是用来在堆上申请内存地址的关键字,他产生的变量不会自动释放,除非delete来手动释放,或者程序结束时由操作系统释放,使用new的优势是内存使用比较灵活,理论可以申请任意大小的内存区块(实际与操作系统有关),但这很容易产生问题,一不小心忘记释放对象,特别是在频繁调用的函数内创建的对象忘记释放时,会产生内存溢出,严重时导致程序出错,系统崩溃。new一般都是在类的定义中使用,结合delete可以使包含new出来对象的类也具有自带变量功能,这样就继承了两种方式的优势。
--------------------------------------------------------------
另外,最新的C++标准更新了auto关键字的功能
除了具有原有的含义外,还增加了一种类似其他高级语言的型别推导特性
使用auto来代替变量的类型,
前提是被明确类型的初始化变量初始化的,可以使用auto关键字
比如int i=10; auto a = i; //这样a也是int类型了
这在使用一些模板类的时候,对于减少冗赘的代码也很有用
---------------------------------------------------------------
另外一个题外话:auto的对应类型不是使用new出来的变量,而是static变量
static变量是程序接收的时候才释放对象的,但它不需要手动释放。
static如果在一个函数内申明,这每次进入这个函数时,还是使用第一次声明的变量,并且还保存的上次使用的值(auto变量这时函数结束是即释放了,再次调用这个函数是,有重新定义了一个新的变量)
static变量如果在结构和类中使用,这结构或类定义的一切对象,都将共享唯一static变量。
展开全部
继承类的内存模型应该是指在发生的继承和派生关系时,如类A继承了类B,那么一个类A的变量与一个类B的变量在内存及数据存储中有什么异同。
一般而言,因为A继承了B,所以直观上看,B所的成员(影响内存结构的主要是数据成员),A类也同样自动拥有。而后A可能还会有新的数据成员(B中就没有这些了)。那么当定义一个A类的变量(也可以说是对象)时,会首 先在内存中依次给B(基类)中就定义好的成员分配内存空间,然后才是A类自己定义的成员。换句话说,A类的变量中来自基类的数据成员会在内存中排在前面(低位地址),而属于自己新定义的数据成员会排在内存中的后面(高位地址)。
这样做的一个典型优势是,如果定义了一个A类变量的指针,那么把这个指针强制转换成B类的指针(指针的强制转换)对代码的实际运行不会有任何影响,通过该指针进行的数据访问不会造成越界访问的问题。
一般而言,因为A继承了B,所以直观上看,B所的成员(影响内存结构的主要是数据成员),A类也同样自动拥有。而后A可能还会有新的数据成员(B中就没有这些了)。那么当定义一个A类的变量(也可以说是对象)时,会首 先在内存中依次给B(基类)中就定义好的成员分配内存空间,然后才是A类自己定义的成员。换句话说,A类的变量中来自基类的数据成员会在内存中排在前面(低位地址),而属于自己新定义的数据成员会排在内存中的后面(高位地址)。
这样做的一个典型优势是,如果定义了一个A类变量的指针,那么把这个指针强制转换成B类的指针(指针的强制转换)对代码的实际运行不会有任何影响,通过该指针进行的数据访问不会造成越界访问的问题。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
东西多了点。呵呵。帮你详细说一下。
1. new和new[]的区别
new 用于单个对象或实例的创建,就是调用类的构造函数。
new [] 用于创建对象或实例的数组实例,并且地址是连续的。(内存分配的时候有可能不连续,但地址链表是连续的。)
2. 虚函数(这个没办法说,只能举例子)
class person
{
public :
virtual say();
}
class techer : public person
{
public :
protected override say();
}
class student : public person
{
public :
protected override say();
}
第三个没理解什么意思。
前面两个不知道你看懂没有。没有的话联系我。
1. new和new[]的区别
new 用于单个对象或实例的创建,就是调用类的构造函数。
new [] 用于创建对象或实例的数组实例,并且地址是连续的。(内存分配的时候有可能不连续,但地址链表是连续的。)
2. 虚函数(这个没办法说,只能举例子)
class person
{
public :
virtual say();
}
class techer : public person
{
public :
protected override say();
}
class student : public person
{
public :
protected override say();
}
第三个没理解什么意思。
前面两个不知道你看懂没有。没有的话联系我。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
new [] 是申请一个连续的存储空间,也就是数组啦
虚函数是通过虚函数表实现的
继承类的内存模型,前一部分是基类的,之后才是自己的。
虚函数是通过虚函数表实现的
继承类的内存模型,前一部分是基类的,之后才是自己的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询