C++重点知识(面试复习)总结

本文主要是针对c++重点、常用及面试经常遇到的知识点进行总结。

1. C++ Virtual关键字详解:
 C++ Virtual详解 - 茄子_2008 - 博客园

补充:子类覆盖父类的非virtual方法(如foo)。父类引用指向子类对象。调用的foo函数为父类foo函数。
  子类覆盖父类的virtual方法(如foo)。父类引用指向子类对象。调用的foo函数为子类foo函数。

虚拟继承:Virtual public;

 C++虚继承的意义和使用_黑盒子的博客-CSDN博客_虚拟继承的作用和目的


2. C++/C相互调用?

 extern “C"作用_把握自己。-CSDN博客

采用dlopen、dlsym、dlclose加载动态链接库 - 简书


3. extern

    extern是C/C++语言中表明函数全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。

C++项目中的extern "C" {} - 吴秦 - 博客园

extern "C"的用法解析 - Xulei - 博客园


4. static

1.局部变量:

在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。

1.内存中的位置:静态存储区

2.初始化:未经初始化的全局静态变量会被程序自动初始化为0

3.作用域:作用域仍为局部作用域。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置(从原来的栈中存放改为静态存储区)及其生命周期(局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束),但未改变其作用域。

2.全局变量

在全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。

 1.内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)

 2.初始化:未经初始化的全局静态变量会被程序自动初始化为0

 3.作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

注:static修饰全局变量,并未改变其存储位置及生命周期,而是改变了其作用域,使当前文件外的源文件无法访问该变量,好处如下:

(1)不会被其他文件所访问,修改

(2)其他文件中可以使用相同名字的变量,不会发生冲突。而普通全局变量只要定义了,任何地方都能使用,普通全局变量只能定义一次,但是可以声明多次(外部链接)。

注意:全局变量的作用域是全局范围,但是在某个文件中使用时,必须先声明。

3. 类的成员变量

用static修饰类的数据成员实际使其成为类的全局变量,会被类的所有对象共享,包括派生类的对象。static类对象必须在类外进行初始化(不过也可以用const修饰static数据成员在类内初始化),static修饰的变量先于对象存在,所以static修饰的变量要在类外进行初始化,static修饰的成员变量在对象中是不占用内存的,因为它不是跟对象一起在堆或者栈中生成的,它是在静态存储区生成的

特点:

         1.不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。 

         2.可以通过类名.变量直接使用类名+静态成员变量。

4.类的成员函数

  1. 用static修饰成员函数,使这个类只存在这一份函数,所有对象共享该函数,不含this指针。
  2. 静态成员是可以独立访问的,也就是说,无须创建任何对象实例就可以访问。base::func(5,3);当static成员函数在类外定义时不需要加static修饰符。
  3. 在静态成员函数的实现中不能直接引用类中说明的非静态成员,可以引用类中说明的静态成员。因为静态成员函数不含this指针。

5.const

  1.限定变量为不可修改。

  2.限定成员函数不可以修改任何类的成员数据。

  (在声明一个成员函数时,若该成员函数并不对数据进行修改,应尽可能将该成员函数声明为const 成员函数。)

  3.const与指针:

    const char *p 表示 指向的内容不能改变。

    char * const p,就是将P声明为常指针,它的地址不能改变,是固定的,但是它的内容可以改变。

4.不可以同时用const和static修饰成员函数。

  C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为      static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。

  我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保      函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。


6.volatile

        是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。

当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。

volatile 定义变量的值是易变的,每次用到这个变量的值的时候都要去重新读取这个变量的值,而不是读寄存器内的备份。

多线程中被几个任务共享的变量需要定义为 volatile 类型。


7.struct跟class的区别

        1. 默认权限(struct-public, class-private)

        2. 是否可用于声明模板(struct不可以, class可以)

         struct 和class到底有什么区别 - yocichen - 博客园


8.sizeof 跟strlen的区别

功能不同:

        sizeof是操作符,参数为任意类型,主要计算类型占用内存大小。 

        strlen()是函数,其函数原型为:extern unsigned int strlen(char *s);其参数为char*,strlen只能计算以"\0"结尾字符串的长度,计算结果不包括"\0"。

        char* ss="0123456789"; 
        //s1=4,ss为字符指针在内存中占用4个字节 
        int s1=sizeof(ss); 
        //s2=10,计算字符串ss的长度 
        int s2=strlen(ss); 

参数不同:

        当将字符数组作为sizeof()的参数时,计算字符数组占用内存大小;当将字符数组作为strlen()函数,字符数组转化为char*。因为sizeof的参数为任意类型,而strlen()函数参数只能为char*,当参数不是char*必须转换为char*。

        char str[]="abced"; 
        //a为6(1*6),字符数组str包含6个元素(a,b,c,d,e,\0),每个元素占用1个字节 
        int a= sizeof(str); 
        //len为5,不包含"\0", 
        int len=strlen(str); 
        //str[0]是字符元素a,所以b=1 
        int b= sizeof(str[0]); 


9.inline

在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数。

#include <stdio.h>
//函数定义为inline即:内联函数
inline char* dbtest(int a) {
    return (i % 2 > 0) ? "奇" : "偶";
}

int main()
{
   int i = 0;
//在for循环的每个dbtest(i)的地方替换成了(i%2>0))? "奇" : "偶",避免了频繁调用函数,对栈内存的消耗
   for (i=1; i < 100; i++) {
       printf("i:%d    奇偶性:%s /n", i, dbtest(i));   
   }
}

10.new 跟malloc的区别

  • new是运算符,malloc()是一个库函数
  • new会调用构造函数,malloc不会;
  • new返回指定类型指针,malloc返回void*指针,需要强制类型转换;
  • new会自动计算需分配的空间,malloc不行;
  • new可以被重载,malloc不能。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin@1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值