近期知识点集合

1.指针变量p进行自加运算(即 执行p++;)后,地址偏移值为1,则其 数据类型为 char。说法是否正确?

解析:错误

class A

{

};

对于一个什么都没有的类,字节也为1。

 

2.c语言中耦合度含义

模块间的耦合性就是指当修改其中某个模块时会影起其他模块运行结果发生不可预料的变化。如果模块间是通过直接调用对方内部的全局变量来实现交互,则两个模块间的耦合性将会变得复杂而且难以控制。而模块间的交互通过一个统一的接口函数来实现,使得模块都无需知道对方模块内部的具体实现(这也就是面向对象里面的封装)。当某个模块内的实现发生改写或升级时,只要确保模块接口不变即可。这就大大降低两模块间的耦合。在规划设计模块时就应认真考虑好模块的接口,以及与其他模块的调用关系。所以要记住编程原则:针对接口编程,而不是针对实现。

 

3.十进制变量i的值为100,那么八进制的变量i的值为?

解析:144

十进制 100=64+32+4 ==1*8^2+4*8^1+4*8^0 ==>144八进制

对于数值小的用凑数法比较快捷

数值大的:

100%8=4100/8=12;

12%8=4;12/8=1;

1%8=1;1/8=0;所以结果是144

 

4.以下代码的运行结果为:

class Base {

public:

Base() {echo();}

virtual void echo() {printf(“Base”);}

};

 

class Derived:public Base {

public:

Derived() {echo();}

virtual void echo() {printf(“Derived”);}

};

  

int main() {

Base* base = new Derived();

base->echo();

return 0;

}

 

解析:

Base

Derived

Derived

Base* base = new Derived();

 

//首先将上面的语句分成两部分:

//前一部分是基类指针指向子类对象实现动态绑定,后一部分是new了一个子类对象;

//语句执行时,先执行后一部分new Derived()这句话,它会调用Derived() {echo();}

//而执行派生类的构造函数时,会先去执行基类的构造函数,所以会调用Base() {echo();},此时不涉及到虚函数的动态绑定,

//因为我们现在才执行了后一部分,还没有动态绑定,所以正常调用基类的echo()函数,执行完后返回到子类的构造函数,执行子类的echo();

//然后执行前一部分,实现虚函数的动态绑定。

base->echo();

//此时考察的就是虚函数的使用了,基类echo申明为虚函数,所以调用时会去子类寻找对应的虚函数执行。

 

5.在c++中的结构体是否可以有构造函数?

解析:

可以有

 

二者的默认访问权限和默认继承属性不一样

是默认公有继承和访问私有的

结构体是默认私有继承和访问公有的

 

6.此题注意一点(没做错)

#include<iostream>

using namespace std;

 

class Base

{

    int x;

public:

    Base(int b): x(b) {}

    virtual void display()

    {

        cout << x;

    };

};

class Derived: public Base

{

    int y;

public:

    Derived(int d): Base(d), y(d) {} void display()

    {

        cout << y;

    }

};

 

int main()

{

    Base b(1);

    Derived d(2);

    Base *p = & d;

    b.display();

    d.display();

    p->display();

    return 0;

 

}

解析:122

Base *p = & d是把 派生类对象的地址&d赋值给指向基类对象的指针变量p。

通过指向基类对象的指针只能访问派生类中的基类成员,而不能访问派生类增加的成员

 

7.知识点

如在定义局部变量时不赋值的话,

则对静态变量来说,编译时自动赋初值0空字符

而对自动变量来说,如果不赋值,它的值是一个不确定的值

 

8.知识点

如果不指定函数类型,系统会隐含指定函数类型为int

 

9.知识点

在创建派生类对象时,构造函数的执行顺序是:

基类构造函数→对象成员构造函数→派生类本身的构造函数

 

10.运行以下 C 语言代码,输出的结果是

 

解析:stra tra ra

相当于把str[0]看成一个独立的字符串,然后char *p=str[0],一个p指针指向它,很容易就得出来了

 

11.知识点

实型 字面值常量 有两种表示方式:小数形式 和 指数形式

小数形式

由最前面的额正负号,数字0-9和小数点组成,不允许有其他符号;

指数形式

包括指数尾数两个不可缺少的部分,用符号E(e)分割

E(e)左边是尾数,为十进制整数或小数形式的实数,

E(e)右边为指数必须为十进制整数,表示乘以10的多少次方

 

12.知识点

论一个汉字占用的字节数,那么 UTF-8 占用3个字节, UTF-16 占用2个字节。

文档最后的结束符号 也需要+2和+3

 

13.字符串赋值 char str[80]; str="abcdefg"是否正确?

解析:

数组名为指针常量,不能更改

数组名是不可以更改的。

const char* str; str="abcdefg";这样写就是正确的,或者char str[80]="abcdefg";

 

14.遇到的最坑的题

以下程序段的输出结果是?

char str[] = "ab\012\\n";

printf("%d", strlen(str));

 

解析:5

这题有个很大的陷阱,

\012是表示八进制数10,也就是ASCII码对应的\n符号。

\\表示一个字符,斜杠

并且strlen结果不算字符串结束符,所以答案为5.

 

15.知识点

C 语言中的文件类型只有 ASCII码文件 和 二进制文件 两种

 

16.知识点

函数的定义不可以嵌套,函数的调用可以嵌套

 

调用嵌套都知道,关于定义嵌套,我首先想到了递归:

递归不就是在函数的定义的时候使用的吗?——是的!

但使用递归,其实是一种函数嵌套调用,因为递归在函数内部使用的时候就一句话,而不是定义。

~

所以,函数可以嵌套调用,而不可以嵌套定义。

 

17.函数func的定义如下:

void func(const int& v1, const int& v2)

{

    std::cout << v1 << ' ';

    std::cout << v2 << ' ';

}

 以下代码在vs中输出结果为____。

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

{

    int i=0;

    func(++i,i++);

    return 0;

}

解析:2 0

C语言函数参数入栈顺序为由右向左,

func(++i, i++)可以分解为

参数 i 先入栈 输出0

然后执行i++ 此时i为1

接着参数 i 先执行++i   i 此时为2  后入栈进行输出 2

 

18.开发C代码时,经常见到如下类型的结构体定义:

typedef struct list_t

{

struct list_t *next;

struct list_t *prev;

char data[0];

}list_t;

最后一行char data[0];的作用是?

 

解析:

方便管理内存缓冲区

减少内存碎片化

 

19.知识点

19.1  死代码的含义是指永远不会被执行到的代码段

 

19.2  strlen是根据ascii码为0的字符来判断是否结束的,'\0'的ascii码为0,是结束符;0本身的值就是0,所以也被看做结束符

 

19.3

1.编辑:也就是编写C/C++程序。

2.预处理:相当于根据预处理指令组装新的C/C++程序。经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的文件无异,只是内容上有所不同。

3.编译:将预处理完的文件进行一系列词法分析、语法分析、语义分析及优化后,产生相应的汇编代码文件。

4.链接:通过链接器将一个个目标文件(或许还会有库文件)链接在一起生成一个完整的可执行程序。 链接程序的主要工作就是将有关的目标文件彼此相连接,也就是将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够被操作系统装入执行的统一整体。在此过程中会发现被调用的函数未被定义。

 

19.4  float指数位8位,指数范围-128至127 。小数位23位

所以float 类型(即 IEEE754 单精度浮点数格式)能表示的最大整数是

2^128-2^104

 

19.5  取余两边都必须为整数

 

 

对象成员构造函数:

一个类的对象可以作为另一个类的数据成员,此时把该对象称为类的对象成员。

 

当一个类中出现对象成员时,该类的构造函数就要为对象成员初始化,对象成员的初始化必须在构造函数的初始化表中完成。

注意:

初始化对象成员时必须用对象成员名,而不是它的类型名。例如:

class Date

{

    int year, month, day;

    Date(int y, int m, int d)

    {

        year = y;

        month = m;

        day = d;

    }

};

 

class Person

{

    char name[12];

    char sex[4];

    Date birthday;

 

public:

    Person(char*, char*, int, int, int);

    ……

};

 

Person:Person(char *n, char *s, int y, int m, int d):birthday(y, m ,d)

 

{

    strcpy(name, n);

    strcpy(sex, s);

}

此处使用birthday(y, m, d),不能使用Date(y, m, d)。

 

若一个类包含对象成员,在建立该类的对象时,先调用对象成员的构造函数,初始化相应的对象成员,然后才执行该类的构造函数。

 

如果一个类包含多个对象成员,对象成员的构造函数的调用顺序由它们在该类中的说明顺序决定,而它们在初始化表中的顺序无关。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章