关于以下代码中的变量在内存中的存储位置描述
int a=0;
class someClass{
int b;
static int c;
};
int main(){
int d=0;
someClass *p=new someClass();
return 0;
}
在C++中,内存一般分为4个区域:
全局区 | 放全局变量、静态数据和常量(程序结束后由系统释放) |
---|---|
文字常量区 | 常量字符串就是放在这里的( 程序结束后由系统释放) |
代码区 | 所有类成员函数和非成员函数代码 |
栈区 | 局部变量、函数参数、返回数据、返回地址(编译器自动分配释放) |
堆区 | new、malloc、calloc、realloc等分配内存函数得到的变量(由程序员分配释放) |
int a=0;//全局变量
class someClass{
int b;//局部变量
static int c;//静态数据
};
int main(){
int d=0;//局部变量
someClass *p=new someClass();//用new分配的变量
return 0;
}
下面程序结果输出为
#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout << "1";
}
A(A &a)
{
cout << "2";
}
virtual ~A()
{
cout << "3";
}
};
class B: public A
{
public:
B()
{
cout << "4";
}
B(B &b)
{
cout << "5";
}
~B()
{
cout << "6";
}
};
int main()
{
A *pa = new B();
delete pa;
return 0;
}
首先调用new B()的时候,发现B继承A,调用父类的构造函数输出1,然后在调用自己的构造函数输出4;在析构的时候顺序是反过来的,先调用自己的析构函数,输出6然后调用父类的析构函数,输出3。
而这里没有用到拷贝构造函数,所以不用管它。
int x[6][4],(* p)[4]; p=x; *(p+2)指向哪里
int *p[4]; //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就zhi需要程序中后续再定义了。
int (*p)[4]; //定义一个数组指针,该指针指向含4个元素的一维数组(数组中每个元素是int型)。
区分int *p[n]; 和int (*p)[n]; 就要看运算符的优先级了。
int p[n]; 中,运算符[ ]优先级高,先与p结合成为一个数组,再由int说明这是一个整型指针数组。
int (*p)[n]; 中( )优先级高,首先说明p是一个指针,指向一个整型的一维数组。
答案:x[2][0]
class Base
{
public:
void f(){cout<<”Base::f()”<<endl;}
protected:
Base(){cout<<”Base::Base”<<endl;}
private:
void g() {cout<<”Base::g()<<endl;}
}
class First: public Base
{
public:
First(){cout<<”First::First”<<endl;}
}
下面语句正确的是?
A.main(){Base a;}
B.main(){First a;}
C.main(){First a;a.f();}
D.main(){First a;a.g();}
A.构造函数权限为protected,在类外除了继承的方式,无法实例化对象。
B.First类是Base类的子类,可以进行实例化对象。
C.子类调用父类的公有成员函数,是符合语法的,正确
D.子类调用父类的私有成员函数,不符合语法,错误
int a[10] = {2,3,5}, 请问a[3]及a[3]之后的数值是什么?
1、未初始化的全局数组为0;
2、未初始化的局部数组为随机值;
3、初始化部分的全局数组与局部数组,初始化部分为初始化值,未初始化部分都为0;(不管全集还是局部)
答案:0
下面程序的输出结果是( )
class A{
public:
long a;
};
class B : public A {
public:
long b;
};
void seta(A* data, int idx) {
data[idx].a = 2;
}
int main(int argc, char *argv[]) {
B data[4];
for(int i=0; i<4; ++i){
data[i].a = 1;
data[i].b = 1;
seta(data, i);
}
for(int i=0; i<4; ++i){
std::cout << data[i].a << data[i].b;
}
return 0;
}
首先明确, A类 大小为 4字节;B 类大小为 8字节
因为B继承自A,基类A有一个long,4字节,派生类B继承A的long加上自身定义了一个long,4+4=8个字节。
所以,A类指针+1移动4字节,B类指针+1移动8字节,所以A类指针和B类指针的移动步长不相同
首先明确, A类 大小为 4字节;B 类大小为 8字节
因为B继承自A,基类A有一个long,4字节,派生类B继承A的long加上自身定义了一个long,4+4=8个字节。
所以,A类指针+1移动4字节,B类指针+1移动8字节,所以A类指针和B类指针的移动步长不相同