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 ...