c/c++基础

来源:互联网 发布:淘宝简约店招 编辑:程序博客网 时间:2024/06/04 20:01

1.char p[]和char *p的区别。 

当你这样定义char p[]="Hello World";意味着

char p[12];

strcpy(p, "Hello world");

p[12]是在栈里临时分配的。虽然p指向的内容是"Hello world", 但是这是复制品,不是原件。当函数结束,char p[]就被程序回收了,所以p[]的内容就不再是"Hello world"了。 

但如果以char *p="Hello world"的方式使用,p指向的是静态字符串存储的位置,也就是说指向"Hello world"的原件,当然没有问题了。(注意此种形式不能在程序中修改字符串。) 

2关于宏

C语言中的define宏定义有带参数的和不带参数两中形式
不带参格式是:#define 宏名 字符串
带参格式是:#define 宏名(参数1,参数2,...) 字符串
在C语言里宏定义只用来做的宏名替换,而不做语法检查的,因而它不是C语句,所以在宏定义的时候不需要在后面加";"
宏也在C里也叫预处理命令,因为宏是在程序编译前先进行字符替换的,所以叫预处理.在C里还有其它的预处理命令如:
#define  #undef  #ifdef等等。

intotally,宏可以使调试更方便,程序更加灵活。

3内存分配函数

void* malloc(unsigned size); 

void* calloc(size_t nelem, size_t elsize); 

void* realloc(void* ptr, unsigned newsize); 

1)函数malloc()和calloc()都可以用来动态分配内存空间。 malloc()函数有一个参数,即要分配的内存空间的大小,malloc 在分配内存时会保留一定的空间用来记录分配情况,分配的次数越多,这些记录占用的空间就越多。另外,根据 malloc 实现策略的不同,malloc 每次在分配的时候,可能分配的空间比实际要求的多些,多次分配会导致更多的这种浪费。当然,这些都和 malloc 的实现有关;calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。如果调用成功,它们都将返回所分配内存空间的首地址。 
2)函数malloc()和函数calloc()的主要区别是前者不能初始化所分配的内存空间,而后者能。 
3) realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。当然,对于缩小,则被缩小的那一部分的内容会丢失。 
4) realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。所以在代码中,我们必须将realloc返回的值,重新赋值给 p :
p = (int *) realloc (p, sizeof(int) *15);
 


4  解析c++中的多态

class A 
{
    public:
        A() {}
        (virtual) void print() 
        {
            cout << “This is A.” << endl;
        }
};
class B : public A 
{
    public:
        B() {}
        void print() 
        {
            cout << “This is B.” << endl;   
        }   
};   
int main(int argc, char* argv[]) 
{    
    B b; 
    A a; 
    a = b;
    a.print; //make1
    // A &a = b; a->print();———————————-make2
    //A *a = new B();a->print();——————————–make3
    return 0;
}
这将显示:
This is B.
如果把virtual去掉,将显示:
This is A.
(make1,2,3分别是对应三种方式,调用结果是一样的)
加上virtual ,多态了,B中的print被调用了,也就是可以实现父类使用子类的方法。

这里定义两个类,类A和类B,其中A是B的父亲,B类继承了A类,两个类中都有成员函数print(),此时A用了virtual,则表明子类的指针可以赋值给父类,实现父类使用子类的方法,这也正是多态的用途。

如果去掉virtual,则只有当运行时才知道调用哪个函数,因为一个基类的对象可兼容派生类的对象,一个基类的指针可指向派生类的对象,一个基类的引用可引用派生类的对象,于是对于通过基类的对象指针(或引用)对成员函数的调用,编译时无法确定对象的类,而只是在运行时才能确定并由此确定调用哪个类中的成员函数。

0 0
原创粉丝点击