C 小問題以及解析

2021-07-02 14:53:56 字數 3478 閱讀 8815

1. 類函式中訪問引數的私有變數

例如 string(conststring &other)

m_data=other.x;//x是string類的私有成員 

因為拷貝建構函式是放在本身這個類裡的,而類中的函式可以訪問這個類的物件的所有成員,當然包括私有成員了,訪問控制是針對類而言的,而不是物件。

string(const string &other)

m_data=other.x;//x是string類的私有成員

引用引數物件也是string類的,所以沒問題。

2. 函式宣告當作物件定義

struct test

test(int){}

test(){}

voidfun();

int val;

a& operator=(const a& a )

cout<< "= func:" << &a << endl;

cout<< "= func:" << this << endl;

return*this;

a(const a&) :val(5)

int main()

a a = 3;  // 本來是先呼叫 a(int )構造乙個臨時物件,然後 呼叫拷貝建構函式構造 a

// 這裡是直接呼叫 a(int)構造 a,c++標準的原話,大意

// 為:當乙個隱式宣告的物件被拷貝到乙個同型別的物件時,編譯器可以選擇跳過拷貝的過程而直接將拷貝的終

// 點物件作為構造的物件,而不必考慮因此帶來的任何***。

cout << &a return 1;

3. char* ,int,float隱式轉化為bool型別

#include

#include

using namespace std;

int main()

char *p = "jhk"; //char *p = "";也會輸出1 char *p =null;會輸出0

bool falg = p;

cout << falg;

system("pause");

return 1;

int main(int argc, const char *argv)

int a = 1;

char * b = "wo";

float c = 1.1;

bool x;

x = a;

x = b;

x = c;

system("pause");

return 0;

總結:int,char*,float確實都可以隱式轉化成bool而不會有任何警告,導致出現問題很不容易發現,這裡在過載函式的時候確實需要萬分注意。

4.列舉常量:

// 類ct的大小為4

class ct

public:

enum

size1 = 100, // 列舉常量不占用記憶體空間,列舉它的隱含資料型別是int,不能表示浮點數,如pi = 3.1415

size2 = 200

private:

int m_int;

5. 常量問題:

const int cstint = 0;

cout << sizeof(cstint)<< endl;

//cstint = 1;  // 常量不能修改,編譯時進行檢測

cout << cstint int* pint = (int*)&cstint;// c++強制轉換

*pint = 3;  // 這樣將可以修改常量cstint對應記憶體空間的值了,呵呵

cout << *pint //  mov eax,***value

//  push eax

//  call ***function

//  用const變數的時候是

//  push 0

//  call ***function

6. 返回值以及extern問題:

// #include "test1.h" 使用test1標頭檔案也可以

#include "test.h"

// .c檔案,c++編譯器將以c來編譯此檔案

int add( int a, int b )

// 返回臨時變數,如果int有建構函式,將呼叫建構函式,臨時變數儲存在此函式之外,節約了拷貝,但是此句將編譯通不過,

// 因為當前檔案是.c檔案,而c語言中沒有類的概念,所以也就沒有建構函式的概念,所以此句通不過

//return int(a + b);

return a+b;

// return a+b;  // 將把a+b的值拷貝到外部臨時變數中

// 下面函式將編譯通不過,因為extern是表明函式和全域性變數作用範圍的關鍵字

// int testextern()

// extern int nint;

// nint = 10;

// int num = nint;

// //int nint = 1;

// return num;

7. 釋放類物件和內建型別的空間:

2. int *p = new int[5];

//最好用deletep;  對於內建資料型別,如int char float等,可以用delete p代替delete p;

delete p;

// 因為申請記憶體時,提供了確定的大小,釋放時已經知道要釋放多少記憶體,如本例是5個int大小

// 對於類,結構體等,釋放陣列時要使用delete p,因為申請的內存在執行時可能會變化,如類中

// 若有char *p;乙個資料變數,在執行中有p = new char[5];,其類記憶體變化了,要使用delete p

// 告訴編譯器釋放的是乙個陣列,以便釋放時呼叫其析構函式來釋放動態申請的空間。

8. 乙個記憶體分配導致的錯誤

#include

#include

int main()

int m = 0;

int n = 3;

char pch = "";

scanf( "%s", pch);

printf( "%s\n\n",pch );

printf( "%d\n", n); // n不為3了

getchar();

getchar();

return 1;

解釋:pch沒給大小,而且後面的賦值也是空串

它指向乙個存不了資料的空間

即空間大小除了乙個\0以為,沒資料

pch指向的只有乙個'\0'字元,輸入時pch所指向的是堆疊中的記憶體,所以會覆蓋n,導致n改變

#include

void main()

int i,j,a[2] ;

for( i = 0 ; i <= 2 ; i++  )

scanf("%d",&a[i]); // 陣列越界,但不會報錯 a+3是j的位址

printf("%d\n",j);  // j為最後輸入的值

C語言小問題

define max a,b 於是我開始修改 檢視各種 反饋的結果。int a 10,b 100 int x 好吧,我把圓括號給刪除了,於是編譯器給我報錯了。error expected expression before int int a,b 好吧,不能沒有圓括號,雖然現在還不知道是為啥。然後我...

C 程式設計小問題

1.vs2008中使 對齊的快捷鍵 全選 ctrl a ctrl k,f 格式化 2.定位 前乙個花括號的方法 ctrl 3.opencv 中在使用mat roi 時,需要注意 如果對roi處理會影響全域性的 所以在處理時需要新宣告乙個mat然後clone到這再處理。4.補充vs快捷鍵 在vc200...

C 學習小問題

1.變數的值是變數所對應記憶體區域內存放的二進位制序列,變數的值不會因為變數型別的改變而發生改變,當變數轉換成對應的型別時,記憶體區域的二進位制序列以該型別的形式翻譯出來。這也是強制型別轉換能夠成立的原因。2.define pi 3.14 int a pi pi 01415926 int b pi ...