近期知识点集合
1.指針變量p進(jìn)行自加運(yùn)算(即 執(zhí)行p++;)后,地址偏移值為1,則其 數(shù)據(jù)類(lèi)型為 char。說(shuō)法是否正確?
解析:錯(cuò)誤
class A
{
};
對(duì)于一個(gè)什么都沒(méi)有的類(lèi),字節(jié)也為1。
?
2.c語(yǔ)言中耦合度含義
模塊間的耦合性就是指當(dāng)修改其中某個(gè)模塊時(shí)會(huì)影起其他模塊運(yùn)行結(jié)果發(fā)生不可預(yù)料的變化。如果模塊間是通過(guò)直接調(diào)用對(duì)方內(nèi)部的全局變量來(lái)實(shí)現(xiàn)交互,則兩個(gè)模塊間的耦合性將會(huì)變得復(fù)雜而且難以控制。而模塊間的交互通過(guò)一個(gè)統(tǒng)一的接口函數(shù)來(lái)實(shí)現(xiàn),使得模塊都無(wú)需知道對(duì)方模塊內(nèi)部的具體實(shí)現(xiàn)(這也就是面向?qū)ο罄锩娴姆庋b)。當(dāng)某個(gè)模塊內(nèi)的實(shí)現(xiàn)發(fā)生改寫(xiě)或升級(jí)時(shí),只要確保模塊接口不變即可。這就大大降低兩模塊間的耦合。在規(guī)劃設(shè)計(jì)模塊時(shí)就應(yīng)認(rèn)真考慮好模塊的接口,以及與其他模塊的調(diào)用關(guān)系。所以要記住編程原則:針對(duì)接口編程,而不是針對(duì)實(shí)現(xiàn)。
?
3.十進(jìn)制變量i的值為100,那么八進(jìn)制的變量i的值為?
解析:144
十進(jìn)制 100=64+32+4 ==1*8^2+4*8^1+4*8^0 ==>144八進(jìn)制
對(duì)于數(shù)值小的用湊數(shù)法比較快捷
數(shù)值大的:
100%8=4;100/8=12;
12%8=4;12/8=1;
1%8=1;1/8=0;所以結(jié)果是144
?
4.以下代碼的運(yùn)行結(jié)果為:
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();
?
//首先將上面的語(yǔ)句分成兩部分:
//前一部分是基類(lèi)指針指向子類(lèi)對(duì)象實(shí)現(xiàn)動(dòng)態(tài)綁定,后一部分是new了一個(gè)子類(lèi)對(duì)象;
//語(yǔ)句執(zhí)行時(shí),先執(zhí)行后一部分new Derived()這句話(huà),它會(huì)調(diào)用Derived() {echo();}
//而執(zhí)行派生類(lèi)的構(gòu)造函數(shù)時(shí),會(huì)先去執(zhí)行基類(lèi)的構(gòu)造函數(shù),所以會(huì)調(diào)用Base() {echo();},此時(shí)不涉及到虛函數(shù)的動(dòng)態(tài)綁定,
//因?yàn)槲覀儸F(xiàn)在才執(zhí)行了后一部分,還沒(méi)有動(dòng)態(tài)綁定,所以正常調(diào)用基類(lèi)的echo()函數(shù),執(zhí)行完后返回到子類(lèi)的構(gòu)造函數(shù),執(zhí)行子類(lèi)的echo();
//然后執(zhí)行前一部分,實(shí)現(xiàn)虛函數(shù)的動(dòng)態(tài)綁定。
base->echo();
//此時(shí)考察的就是虛函數(shù)的使用了,基類(lèi)echo申明為虛函數(shù),所以調(diào)用時(shí)會(huì)去子類(lèi)尋找對(duì)應(yīng)的虛函數(shù)執(zhí)行。
?
5.在c++中的結(jié)構(gòu)體是否可以有構(gòu)造函數(shù)?
解析:
可以有
?
二者的默認(rèn)訪(fǎng)問(wèn)權(quán)限和默認(rèn)繼承屬性不一樣
類(lèi)是默認(rèn)公有繼承和訪(fǎng)問(wèn)私有的
結(jié)構(gòu)體是默認(rèn)私有繼承和訪(fǎng)問(wèn)公有的
?
6.此題注意一點(diǎn)(沒(méi)做錯(cuò))
#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是把 派生類(lèi)對(duì)象的地址&d賦值給指向基類(lèi)對(duì)象的指針變量p。
通過(guò)指向基類(lèi)對(duì)象的指針,只能訪(fǎng)問(wèn)派生類(lèi)中的基類(lèi)成員,而不能訪(fǎng)問(wèn)派生類(lèi)增加的成員。
?
7.知識(shí)點(diǎn)
如在定義局部變量時(shí)不賦值的話(huà),
則對(duì)靜態(tài)變量來(lái)說(shuō),編譯時(shí)自動(dòng)賦初值0或空字符
而對(duì)自動(dòng)變量來(lái)說(shuō),如果不賦值,它的值是一個(gè)不確定的值。
?
8.知識(shí)點(diǎn)
如果不指定函數(shù)類(lèi)型,系統(tǒng)會(huì)隱含指定函數(shù)類(lèi)型為int
?
9.知識(shí)點(diǎn)
在創(chuàng)建派生類(lèi)對(duì)象時(shí),構(gòu)造函數(shù)的執(zhí)行順序是:
基類(lèi)構(gòu)造函數(shù)→對(duì)象成員構(gòu)造函數(shù)→派生類(lèi)本身的構(gòu)造函數(shù)
?
10.運(yùn)行以下 C 語(yǔ)言代碼,輸出的結(jié)果是
?
解析:stra tra ra
相當(dāng)于把str[0]看成一個(gè)獨(dú)立的字符串,然后char *p=str[0],一個(gè)p指針指向它,很容易就得出來(lái)了
?
11.知識(shí)點(diǎn)
實(shí)型 字面值常量 有兩種表示方式:小數(shù)形式?和 指數(shù)形式
小數(shù)形式:
由最前面的額正負(fù)號(hào),數(shù)字0-9和小數(shù)點(diǎn)組成,不允許有其他符號(hào);
指數(shù)形式;
包括指數(shù)和尾數(shù)兩個(gè)不可缺少的部分,用符號(hào)E(e)分割;
E(e)左邊是尾數(shù),為十進(jìn)制整數(shù)或小數(shù)形式的實(shí)數(shù),
E(e)右邊為指數(shù),必須為十進(jìn)制整數(shù),表示乘以10的多少次方
?
12.知識(shí)點(diǎn)
論一個(gè)漢字占用的字節(jié)數(shù),那么 UTF-8 占用3個(gè)字節(jié), UTF-16 占用2個(gè)字節(jié)。
文檔最后的結(jié)束符號(hào) 也需要+2和+3
?
13.字符串賦值 char str[80]; str="abcdefg"是否正確?
解析:
數(shù)組名為指針常量,不能更改
數(shù)組名是不可以更改的。
const char* str; str="abcdefg";這樣寫(xiě)就是正確的,或者char str[80]="abcdefg";
?
14.遇到的最坑的題
以下程序段的輸出結(jié)果是?
char str[] = "ab\012\\n";
printf("%d", strlen(str));
?
解析:5
這題有個(gè)很大的陷阱,
\012是表示八進(jìn)制數(shù)10,也就是ASCII碼對(duì)應(yīng)的\n符號(hào)。
\\表示一個(gè)字符,斜杠。
并且strlen結(jié)果不算字符串結(jié)束符,所以答案為5.
?
15.知識(shí)點(diǎn)
C 語(yǔ)言中的文件類(lèi)型只有 ASCII碼文件?和 二進(jìn)制文件?兩種
?
16.知識(shí)點(diǎn)
函數(shù)的定義不可以嵌套,函數(shù)的調(diào)用可以嵌套
?
調(diào)用嵌套都知道,關(guān)于定義嵌套,我首先想到了遞歸:
遞歸不就是在函數(shù)的定義的時(shí)候使用的嗎?——是的!
但使用遞歸,其實(shí)是一種函數(shù)嵌套調(diào)用,因?yàn)檫f歸在函數(shù)內(nèi)部使用的時(shí)候就一句話(huà),而不是定義。
~
所以,函數(shù)可以嵌套調(diào)用,而不可以嵌套定義。
?
17.函數(shù)func的定義如下:
void func(const int& v1, const int& v2)
{
????std::cout << v1 << ' ';
????std::cout << v2 << ' ';
}
?以下代碼在vs中輸出結(jié)果為_(kāi)___。
int main (int argc, char* argv[])
{
????int i=0;
????func(++i,i++);
????return 0;
}
解析:2 0
C語(yǔ)言函數(shù)參數(shù)入棧順序?yàn)橛捎蚁蜃?
func(++i, i++)可以分解為
參數(shù) i 先入棧 輸出0
然后執(zhí)行i++ 此時(shí)i為1
接著參數(shù) i 先執(zhí)行++i ??i 此時(shí)為2 ?后入棧進(jìn)行輸出 2
?
18.開(kāi)發(fā)C代碼時(shí),經(jīng)常見(jiàn)到如下類(lèi)型的結(jié)構(gòu)體定義:
typedef struct list_t
{
struct list_t *next;
struct list_t *prev;
char data[0];
}list_t;
最后一行char data[0];的作用是?
?
解析:
方便管理內(nèi)存緩沖區(qū)
減少內(nèi)存碎片化
?
19.知識(shí)點(diǎn)
19.1??死代碼的含義是指永遠(yuǎn)不會(huì)被執(zhí)行到的代碼段
?
19.2??strlen是根據(jù)ascii碼為0的字符來(lái)判斷是否結(jié)束的,'\0'的ascii碼為0,是結(jié)束符;0本身的值就是0,所以也被看做結(jié)束符
?
19.3
1.編輯:也就是編寫(xiě)C/C++程序。
2.預(yù)處理:相當(dāng)于根據(jù)預(yù)處理指令組裝新的C/C++程序。經(jīng)過(guò)預(yù)處理,會(huì)產(chǎn)生一個(gè)沒(méi)有宏定義,沒(méi)有條件編譯指令,沒(méi)有特殊符號(hào)的輸出文件,這個(gè)文件的含義同原本的文件無(wú)異,只是內(nèi)容上有所不同。
3.編譯:將預(yù)處理完的文件進(jìn)行一系列詞法分析、語(yǔ)法分析、語(yǔ)義分析及優(yōu)化后,產(chǎn)生相應(yīng)的匯編代碼文件。
4.鏈接:通過(guò)鏈接器將一個(gè)個(gè)目標(biāo)文件(或許還會(huì)有庫(kù)文件)鏈接在一起生成一個(gè)完整的可執(zhí)行程序。 鏈接程序的主要工作就是將有關(guān)的目標(biāo)文件彼此相連接,也就是將在一個(gè)文件中引用的符號(hào)同該符號(hào)在另外一個(gè)文件中的定義連接起來(lái),使得所有的這些目標(biāo)文件成為一個(gè)能夠被操作系統(tǒng)裝入執(zhí)行的統(tǒng)一整體。在此過(guò)程中會(huì)發(fā)現(xiàn)被調(diào)用的函數(shù)未被定義。
?
19.4 ?float指數(shù)位8位,指數(shù)范圍-128至127 。小數(shù)位23位。
所以float 類(lèi)型(即 IEEE754 單精度浮點(diǎn)數(shù)格式)能表示的最大整數(shù)是
2^128-2^104
?
19.5 ?取余兩邊都必須為整數(shù)
?
?
對(duì)象成員構(gòu)造函數(shù):
一個(gè)類(lèi)的對(duì)象可以作為另一個(gè)類(lèi)的數(shù)據(jù)成員,此時(shí)把該對(duì)象稱(chēng)為類(lèi)的對(duì)象成員。
?
當(dāng)一個(gè)類(lèi)中出現(xiàn)對(duì)象成員時(shí),該類(lèi)的構(gòu)造函數(shù)就要為對(duì)象成員初始化,對(duì)象成員的初始化必須在構(gòu)造函數(shù)的初始化表中完成。
注意:
初始化對(duì)象成員時(shí)必須用對(duì)象成員名,而不是它的類(lèi)型名。例如:
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)。
?
若一個(gè)類(lèi)包含對(duì)象成員,在建立該類(lèi)的對(duì)象時(shí),先調(diào)用對(duì)象成員的構(gòu)造函數(shù),初始化相應(yīng)的對(duì)象成員,然后才執(zhí)行該類(lèi)的構(gòu)造函數(shù)。
?
如果一個(gè)類(lèi)包含多個(gè)對(duì)象成員,對(duì)象成員的構(gòu)造函數(shù)的調(diào)用順序由它們?cè)谠擃?lèi)中的說(shuō)明順序決定,而它們?cè)诔跏蓟碇械捻樞驘o(wú)關(guān)。
總結(jié)