牛客练习题-2020-09-23

本文详细解析了C++中不同类型的变量如何存储在内存的不同区域,包括全局区、文字常量区、代码区、栈区和堆区。并通过具体代码示例展示了变量的存储位置及其在程序运行过程中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于以下代码中的变量在内存中的存储位置描述

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类指针的移动步长不相同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值