C/C++(C++類型增強)
阿新 • • 發佈:2018-03-04
urn class 不可 void alloc false int %d 個數
C++類型增強
類型檢查更嚴格
把一個const類型的指針賦給非const類型的指針。c語言中可以通的過,但是在c++中則編不過去
const int a = 10;
a = 100;//const修飾的不能修改
int *p = &a;
*p = 100;
printf("a = %d\n",a);//a = 100,c裏面類型不嚴密,指針能修改const修飾的變量,實際是a是const int *類型,也就是說強行的賦給int *,把const漏掉了。
const int a與int const a一樣,看const修飾誰把類型去掉。
int *const p;把int去掉,p不能改變,p指向的內容可以改變。
const int *const p;它指向的本身和內容都不能改變。
#include<iostream> using namespace std; int main() { const int a = 100;//const修飾的必須要初始化 int *p = &a;//不可以報錯 const int *無法轉化成int *; const int *p = &a;//才是正確的 //C++不需要強轉 char *p = malloc(100);//C++會報錯 char *q = (char*)malloc(100);//void * return 0; }
布爾類型(bool)
c 語言的邏輯真假用 0 和非 0 來表示。而 c++中有了具體的類型。
int main()
{
bool flag = true;
if(flag)
printf("hello world!\n");
else
printf("hello C++!\n");
return 0;
}
真正的枚舉(enum)
c 語言中枚舉本質就是整型,枚舉變量可以用任意整型賦值。而 c++中枚舉變量,只能用被枚舉出來的元素初始化。
bool用枚舉實現過程:
#include<iostream>
enum BOOL
{
FALSE,TURE
};
int main()
{
const int a = 100;
BOOL flag = TRUE;
bool aa = true;
if(flag)
cout<<a;
printf("sizeof(flag) = %d sizeof(BOOL) = %d sizeof(bool) = %d\n",sizeof(flag),sizeof(BOOL),sizeof(bool));
}
//sizeof(flag) = 4 sizeof(BOOL) = 4 sizeof(bool) = 1
//enum枚舉本質是整型
它和即將所學的string類型並不是實際意義上的數據類型而是一個對象。
enum SEASOM
{
Spr,Sum,Autu,Win
};
int main()
{
SEASON s;
s = Win;//在C++中比較嚴格,除了枚舉外的無法賦值。c裏面就可以賦其他值。
return 0;
}
其實枚舉可以和宏來等價
#define Spr 0
#define Sun 1
....
enum
{
Spr = 1,Sum,Autu,Win
};
在C++中經可能的使用枚舉,const代替使用宏。
表達式的值可被賦值
c:
int main()
{
int a,b=10;
a = b = 100;//100賦值給b,b = 100這個表達式賦值給a。
(a = b) = 100;//錯誤,表達式是不可被賦值的
(a != b?a:b) = 1000;//錯誤
return 0;
}
c++
int main()
{
int a,b = 5;
(a = b) = 100;
printf("a = %d b = %d\n",a,b);
(a != b?a:b) = 1000;
printf("a = %d b = %d\n",a,b);
return 0;
}
//a = 100,b = 5;
//a = 1000,b = 5
//a = b是一個表達式,b的值賦值給a,最後把100的值賦值給a,b的值沒發生變化。
體現C++對C語言的限制與提升
cin cout類對象
scanf printf函數的功能相同
int main()
{
char name[30];
scanf("%s",name);//不安全的輸入,輸入很多會掛機
fgets(name,30,stdin);//最多只能輸入29個字符,比較安全。
cin>>name;//>>流輸入運算符
cout<<"name = "<<name<<endl;
//"name = "字符串流入cout對象,name流入cout對象,endl(換行)流入cout對象中,從左至右的順序。
string name1;
cin>>name1;
cout<<name1;
//很安全,輸多少都不會掛機
cin>>a>>b;//有順序,從鍵盤輸入的第一個數流入a,第二個數流入b
//<=>
cin>>a;
cin>>b;
return 0;
}
C/C++(C++類型增強)