码迷,mamicode.com
首页 > 编程语言 > 详细

C/C++编程细节(二)

时间:2015-09-01 01:52:32      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:c++   c   细节   

1、静态成员与类

A、静态成员属于类,而不是属于某个特定的对象,它是由该类的所有对象共享的,因此不能在类的构造方法中初始化

B,静态成员属于该类所有对象公有,可以被类对象调用

C,静态成员收private的限制

D,静态成员属于类和该类的所有对象,可以用类名直接调用


2、引用

引用为对象起了另外的一个名字,该对象是已经存在的对象,引用必须初始化,有类型


3、虚函数表、虚表指针

         有虚函数的类,前四个字节是虚表指针,指向虚表。

class Test{
public:
    int a;
    int b;
    virtual void fun() {}
    Test(int temp1 = 0, int temp2 = 0)
    {
        a=temp1 ;
        b=temp2 ;
    }
    int getA()
    {
        return a;
    }
    int getB()
    {
        return b;
    }
};
 
int main()
{
    Test obj(5, 10);
    // Changing a and b
    int* pInt = (int*)&obj;
    *(pInt+0) = 100;  
    *(pInt+1) = 200;  
    cout << "a = " << obj.getA() << endl;
    cout << "b = " << obj.getB() << endl;
    return 0;
}

代码输出:200 10


3、const

    c++中,声明const int i,是在哪个阶段做到 i只可读的。

答案:编译阶段。


4、数组指针与二维数组

(一)int a[3][4],下面哪个不能表示 a[1][1]?

A、*(&a[0][0]+5)
B、*(*(a+1)+1)
C、*(&a[1]+1)
D、*(a[1]+1)
答案:C
解析:

在二维数组中a[1]表示的是a[1][0]的地址,数组在内存中连续存储,所以a[1]+1表示的是a[1][1]的地址,所以D可以取得正确的值;
指针操作*(a+1)与a[1]等价,所以B也可以取得正确的值;
二维数组在内存中是行优先存储的,所以A中a[0][0]的地址加5可以取得正确值;
C选项错误,应改为*(&a[1][0]+1),否则,则指向a[2][0]。


(二) 要使指针变量p指向2维数组A的第1个元素,正确的赋值表达式是()

p=A或p=A[0]     

p=A[0]或p=A[0][0]

p=A[0]或p=&A[0][0]        

p=A或p=&A[0][0]  

答案:第三个选项

分析:  A、p = A:在多维数组中,A表示第一维数组的地址,不是第一个元素的地址;

            B、p = A[0]:在二维数组中,指向的是二维数组的第一个元素;

            C、p = &A[0][0]:A[0][0]表示二维数组的第一个元素,所以可以p = &A[0][0]。 


5、inline函数

        因为内联函数是讲比较简单的代码嵌入到类中,避免调用函数产生额外的时间开销,一般用于加快程序执行速度。因为将代码嵌入到类中,所以可能导致可执行文件的变大或者变小。


6、new、malloc

a、都是在堆(heap)上进行动态的内存操作。

b、用malloc函数需要指定内存分配的字节数并且不能初始化对象,new 会自动调用对象的构造函数。

c、delete 会调用对象的destructor,而free 不会调用对象的destructor。

1) malloc 函数: void *malloc(unsigned int size)
         在内存的动态分配区域中分配一个长度为size的连续空间。

         如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化
2)calloc 函数: void *calloc(unsigned int num, unsigned int size)
        按照所给的数据个数和数据类型所占字节数,分配一个 num * size 连续的空间。
        calloc申请内存空间后,会自动初始化内存空间为 0,但是malloc不会进行初始化,其内存空间存储的是一些随机数据。
3)realloc 函数: void *realloc(void *ptr, unsigned int size)
           动态分配一个长度为size的内存空间,并把内存空间的首地址赋值给ptr,把ptr内存空间调整为size。
           申请的内存空间不会进行初始化
4)new是动态分配内存的运算符,自动计算需要分配的空间,在分配类类型的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。动态分配内置类型是否自动初始化取决于变量定义的位置,在函数体外定义的变量都初始化为0,在函数体内定义的内置类型变量都不进行初始化。


7、C++对空类或者空结构体 ,对其sizeof操作时候,默认都是 1个字节



版权声明:本文为博主原创文章,未经博主允许不得转载。

C/C++编程细节(二)

标签:c++   c   细节   

原文地址:http://blog.csdn.net/tfygg/article/details/48139431

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!