C++笔试题

平时学术必须用Python多啊,但校招笔试绕不开语言基础,非cs科班小弱临阵整理些C++题备考。很弱很苦逼。。。

一、指针

1.二维数组指针

#include<stdio.h>
int main(int args,char ** argv)
{
        int map[3][3]={
                {1,2,3},
                {4,5,6},
                {7,8,9}
        };

        int **pMap=(int **)map;

        printf("%d
",map);//数组的首地址
        printf("%d
",*(map+1));//数组第二行首地址
        printf("%d
",*map+1);//数组首行的第二列地址
        printf("%d
",**(map+1));//第二行第一列数值
        printf("%d
",*(*(map+1)+1));//第二行二列数值
        printf("%d
",*(map+1)+1);//第二行二列地址
        printf("%d
",pMap[4]);//数组中的第5个数
        printf("%d
",&pMap[4]);//数组中的第4个数的地址


        return 0;
}

2. 引用和指针的区别

★相同点:

●都是地址的概念;

指针指向一块内存,它的内容是所指内存的地址;而引用则是某块内存的别名。

★不同点:

  1. 指针是一个实体,而引用仅是个别名;
  2. ●引用只能在定义时被初始化一次,之后不可变;指针可变;引用“从一而终”,指针可以“见异思迁”;
  3. ●引用没有const,指针有const,const的指针不可变;(具体指没有int& const a这种形式,而const int& a是有     的,  前者指引用本身即别名不可以改变,这是当然的,所以不需要这种形式,后者指引用所指的值不可以改变)
  4. ●引用不能为空,指针可以为空;
  5. ●“sizeof 引用”得到的是所指向的变量(对象)的大小,而“sizeof 指针”得到的是指针本身的大小;
  6. 指针和引用的自增(++)运算意义不一样;
  7. ●引用是类型安全的,而指针不是 (引用比指针多了类型检查

二、sizeof

1.常规
char str1[] = “Hello” ;
char str2[5] = {'H','e','l','l','o'};
char str3[6] = {'H','e','l','l','o','/0'};
char   *p1 = "Hello";
char *p2[]={"hello","world"};
int     n = 10;
int    *q = &n;

sizeof (str1 ) = 6    (自动加了'/0')  
strlen (str1 ) = 5    (字符串的长度)  
sizeof (str2 ) = 5     (字符数组的大小)
strlen (str2) = 未知 (该字符串缺少结束符'/0')
sizeof (str3) = 6     (字符数组的大小)
strlen (str3) = 5    (该字符串的长度为5)
sizeof ( p1 ) =   4    (p1是一个指针,大小为4)
sizeof ( p2 ) =   8    (p2是长度为2的字符串数组)
sizeof ( n ) =   4    (整型大小为4)
sizeof ( q ) =   4    (q是一个指针,大小为4)

2.动态分配内存
int *p = (int *)malloc( 100 );
sizeof ( p ) = 4      (p是一个指针,大小为4)

3.函数参数
void Function1( char p[],int num ){
    sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}
void Function2( int p[],int num ){
    sizeof ( p ) = 4 (数组在做为函数参数时均化为指针)
}

三、类和对象

四. static

1.static关键字,static全局变量与普通全局变量的区别,static局部变量与普通变量的区别,static函数与普通函数的区别

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;

static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

 

五. const

在C中,const主要用来修饰变量、函数参数。 const作用于变量时,表示该变量具有不可改变的属性。当然,由这个属性,我们就可以清楚地知道为什么const变量要在定义的时候初始化,因为,const变量一旦定义之后,就不能改变(当然,这不是绝对的)。 很经典的例子是const修饰指针,int a = 3; const int * p = &a; int const *p = &a; int * const p = &a; const int * const p = &a; 一个区分const到底是修饰指针本身,还是修饰所指向的内容的简单的方法是看const位于*号的前还是后。如果const位于*号前,则修饰指针指向的内容;如果位于*号后,则修饰指针。由const的本质属性,我们就可以很容易地知道,const位于*号前,表示指针指向的内容不能修改,const 位于*号后,表示指针本身不能修改。如果有两个const,则表示指针指向的内容和指针本身均不能修改。 const作用于函数参数时,由const的本质属性,我们很容易清楚该函数不能改变这个参数。当然,常用的是const指针作参数。 在C中,const的用法主要就是上面两点。

在C++中,除了C中的用法外,还有以下一些用法。 const作用于类的成员,包括成员变量和成员函数。 const作用于成员变量时,我们同样可以根据const的不可修改属性,推论出该成员变量不可被改变。这就引出一个问题,const成员变量如何初始化?解决方法就是构造函数的初始化列表。我们知道,C++中,一般通过成员函数来访问成员变量的,而一般的成员函数是可以改变成员变量的值的,又因为const成员变量是不可以修改的,所以,我们就明白了为什么非const成员函数不能访问const成员变量了。 const作用于成员函数时,那么我们就可以推断出该函数不能修改成员变量的值,包括const成员变量和非const成员变量。当然,我们还可以得出const成员函数不可以调用非const成员函数,原因很简单,非const成员函数可以修改成员变量。

const作用于类的对象、指针或引用时,我们依然可以利用const的不可修改属性,推断出const对象、指针或引用是不可以修改内部的成员变量的,因此,我们就可以得出const对象、指针或引用不能调用非const成员函数的结论了

 

四、虚函数

原文地址:https://www.cnblogs.com/ffan/p/4037539.html