C/C++ 基础

  1. 若char是一字节,int是4字节,指针类型是4字节,代码如下:
class CTest {
    public:
        CTest():m_chData(‘\0’),m_nData(0) {
        }
        virtual void mem_fun(){}
    private:
        char m_chData;
        int m_nData;
        static char s_chData;
};
char CTest::s_chData=’\0’;

问:
(1)若按4字节对齐 sizeof(CTest) 的值是多少?
(2)若按1字节对齐 sizeof(CTest) 的值是多少?

答案 :
若按4字节对齐 sizeof(CTest) 的值是12;
若按1字节对齐 sizeof(CTest) 的值是9

解释:
在类中,如果什么都没有,则类占用1个字节,一旦类中有其他的占用空间成员,则这1个字节就不在计算之内,如一个类只有一个int则占用4字节而不是5字节。

如果只有成员函数,则还是只占用1个字节,因为类函数不占用空间虚函数因为存在一个虚函数表,需要4个字节,数据成员对象如果为指针则为4字节,注意有字节对齐,如果为13字节,则进位到16字节空间。

sizeof的本质是得到某个类型的大小,确切的来说就是当创建这个类型的一个对象(或变量)的时候,需要为它分配的空间的大小。而类也可以理解为类似于int、float这样的一种类型,当类中出现static成员变量的时候,static成员变量是存储在静态区当中的,它是一个共享的量,因此,在为这个类创建一个实例对象的时候,是无需再为static成员变量分配空间的,所以,这个类的实例对象所需要分配的空间是要排除static成员变量的,于是,当sizeof计算类的大小的时候会忽略static成员变量的大小。


2. 运行时的输出结果是()

#include<iostream>
using namespace std;
class MyClass {
public:
    MyClass(int i = 0) {
        cout << i;
    }
    MyClass(const MyClass &x) {
        cout << 2;
    }
    MyClass &operator=(const MyClass &x) {
        cout << 3;
        return *this;
    }
    ~MyClass() {
        cout << 4;
    }
};

int main() {
    MyClass obj1(1), obj2(2);
    MyClass obj3 = obj1;
    return 0;
}

答案: 122444

解析:实例化对象时候,= 代表浅拷贝。后续对象赋值时候,= 代表深拷贝


3. 下面代码会输出什么()

int main(int argc, char **argv)
{
    int a[4] = {1, 2, 3, 4};
    int *ptr = (int *)(&a + 1);
    printf("%d", *(ptr - 1));

    int **pptr = &a;
    printf("%d", *++pptr)
}

答案:4,

解析:&a 是一个指向 int[8] 类型的指针 int (*ptr)[4] = &a,因此 &a + 1 = a + 4 = &a[5]

  • const int * / int const * / int * const
  • 虚函数实现
  • C++ 内存管理
  • tcp udp 区别及各自适用场景举例
  • 野指针问题
  • 字节对齐
  • strcpy 安全性
  • epoll select
  • select 默认描述符最大的个数
  • ipc
  • 多线程、多进程 同步互斥问题
  • 快排算法实现
  • 建立 tcp 连接,client server 分别调用哪些函数

猜你喜欢

转载自blog.csdn.net/yangkuanqaz85988/article/details/50212617