十个基础的C++知识点

1、说说CC++中的static有什么作用

C中:修饰外部静态变量和局部静态变量,函数。外部静态变量可再整个程序中访问,具有记忆性;而局部静态变量仅在局部有效。

#include <stdio.h>

static int a = 1;

static  void fun()

{

    static int b = 10;

    a=2;

}

int main(int argc, const char * argv[]) {

    // insert code here...

    printf("%d\n", a);//1

    fun();

    printf("%d\n", a);//2

    printf("%d\n", b);//错误,b未定义

    return 0;

}

C++中:除了可修饰局部静态变量和外部静态变量、函数,还用来定义类的成员变量和函数。即静态成员和静态成员函数。

class A

{

public:

    static void f(){...}

private:

    static int a;

};

static具有记忆性,C中可设置全局静态变量实现不同函数进行通信;C++中的静态成员则可以在多个对象实例间进行通信。


2、说说strcpysprintfmemcpy三个函数

char*strcpy(char *dest, const char *src);

对象:字符串

注意事项:目的字符串要有足够大的空间容纳源字符串,否则会出现段错误。


int sprintf(char*str, const char *format, ...)

源对象:任意基本类型的数据。

目的对象:字符串


void *memcpy(void*dest, const void *src, size_t n)

对象:内存块

实现内存的拷贝,实现将一块内存拷贝到另一块内存。该函数对源对象与目的对象没有类型现在,只是对内存的拷贝。


三者比较:

strcpy 无疑是最合适的选择:效率高且调用方便。

snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。

memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便。其实 strcpy函数一般是在内部调用 memcpy函数或者用汇编直接实现的,以达到高效的目的。因此,使用 memcpy strcpy拷贝字符串在性能上应该没有什么大的差别。


3. 虚函数与普通成员函数的区别?内联函数和构造函数能否为虚拟函数?

虚函数有virtual关键字,有虚指针和虚函数表,虚指针就是虚函数的接口,而普通成员函数没有。内联函数和构造函数不能为虚函数。


4、简述指针常量与常量指针区别

指针常量:指针是一个常量,指针的值不能修改,指针指向的对象可以改变

常量指针:指向的是一个常量,指向对象不能修改;自身可以修改。

int a

int * const p = &a    //指针常量,*p可以修改*p = 8                                                 

//p不可以修改 p++


int ab

const int *p = &a//常量指针,*p不可修改*p = 8

                 //p 可以修改 p = &b OK


const int * const p = &a// *p p均不可改变


5、数组名和指针的区别

指针是一个变量,有自己对应的存储空间,而数组名仅仅是一个符号,不是变量,因而没有自己对应的存储空间。

1)地址相同,大小不同

2)都可以用指针作为形参

3)指针可以自加,数组名不可以

4)作为参数的数组名的大小和指针的大小相同


6、构造函数能否为虚函数,为什么?

1)从存储空间角度 

       虚函数对应一个续表vtable,这个vtable其实是存储在对象的内存空间的,一般是在首位。如果构造函数是虚函数,就需要通过相应对象内存中得虚函数表指针来调用续表,通过续表调用该虚函数,但是对象还没有实例化,该虚函数表指针都还没有,所以构造函数不能是虚函数。

2)从使用角度

       虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那成为虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。

3)从实际含义上看,虚函数主要实现的是动态行为,而构造函数实现的创建对象,属于静态行为。

虚函数的动态绑定特性是实现重写的关键技术,动态绑定根据实际的调用情况查询相应类的虚函数表,调用相应的虚函数。

      

7、将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?

 格式:类型标识符 &函数名(形参列表及类型说明)函数体

好处:在内存中不产生副本(函数的形参和返回值)

注意事项:

      1)不能返回局部变量的引用。

主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

  2)不能返回指向栈内存的引用

   3)可以返回类成员的引用,但最好是const

   4)流操作符重载返回值申明为“引用”的作用:

流操作符<<>>,这两个操作符常常希望被连续使用,例如cout << "hello" << endl;因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。


8、成员函数通过什么来区分不同对象的成员数据?为什么它能够区分?

      通过this指针来区分的, 因为它指向的是对象的首地址,每个成员都已一个偏移量。


9、拷贝构造函数在哪几种情况下会被调用?

      1)当类的一个对象去初始化该类的另一个对象时;

      2)如果函数的形参是类的对象,调用函数进行形参和实参结合时;

      3)如果函数的返回值是类对象,函数调用完成返回时。


10、流运算符为什么不能通过类的成员函数重载?一般怎么解决?

      因为通过类的成员函数重载必须是运算符的第一个是自己,而对流运算的重载要求第一个参数是流对象。一般通过友元来解决。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值