C++基礎(一) C++對C語言的增強

1 變量定義的位置可以隨用隨定義

對於變量定義的位置可以隨用隨定義

#include <iostream>
using namespace std;

int main(void){
    
    int i = 10;
    for(int i = 0; i < 10; i++){
        cout << "i = " << i << endl;
    }
    return 0;
}

c語言早期版本不支持隨用隨定義

2 對全局變量的檢測能力加強

int g_val;
// int g_val = 10; error: Redefinition of 'g_val'
int main(void){
    return 0;
}

一個變量不管是聲明還是定義,只能出現一次

3 使用struct時 不需要再使用struct關鍵字

struct teacher{
    int age;
    char name[64];
};

int main(void){
    teacher t1;
    //c語言中必須使用 struct teacher t1; 否則報錯:Must use 'struct' tag to refer to type 'teacher'
    return 0;
}

4 新增bool類型

#include <iostream>

using namespace std;
int main(void){
    //1 bool類型的值爲0或1
    bool flag = true;
    cout << " flag = " << flag << endl;
    
    //2 bool類型佔一個字節
    cout << "sizeof(flag) = " << sizeof(flag) << endl;
    
    //3 給bool類型賦值非0的值,他的值都爲1
    flag = 10;
    cout << "flag = " << flag << endl;
}

打印結果

flag = 1
sizeof(flag) = 1
flag = 1

5 const的增強

5.1 不能通過指針間接修改常量值
#include <iostream>
int main(void){
    //1 c++中的const,確實對a起了保護作用, 不能通過指針間接改變a的值
    const int a = 10;
    
    int *p = (int*)&a;
    // c語言中可以通過指針的間接賦值改變const的值
    *p = 20; //此時*p改變的是臨時變量的值,而不是a的值
    
    printf("a = %d\n", a);
    
    return 0;
}

輸出結果

a = 10
5.2 另外引申出const的一些基礎知識
//1 常整型數 
const int a;

//2 常整型數 
int const b;

//3 c是一個指向常整數的指針(所指向的內存數據不能被修改,但是本身可以修改)
int const * c;

//4 d常指針(指針變量不能被修改,但是它所指向內存空間可以被修改)
int * const d;

//5 指向常整型的常指針(指針和它指向的內存空間,均不能被修改)
const int * const e;

示例:

#include <iostream>
int main(void){
    //1 常整型數
    const int a = 10;
    //a = 5;//error:Cannot assign to variable 'a' with const-qualified type 'const int'
    
    //2 常整型數
    int const b = 20;
    //b = 20;//error:Cannot assign to variable 'b' with const-qualified type 'const int'
    
    //3 c是一個指向常整數的指針
    int c_value = 30;
    const int *c = &c_value;
    printf("*c = %d\n",*c);
    
    //本身可以修改
    c = &b;
    printf("*c = %d\n",*c);
    
    //指向的內存數據不能修改
    //*c = 40; error:Read-only variable is not assignable
    
    //4 d常指針
    int d_value = 50;
    int * const d = &d_value;
    *d = 60;
    
    //指向的內存的值可以修改
    printf("d_value = %d\n", d_value);

    // 本身不可以修改
    //d = &c_value; //error:Cannot assign to variable 'd' with const-qualified type 'int *const'
    return 0;
}

輸出結果

*c = 30
*c = 20
d_value = 60
5.3 c語言中的const是冒牌貨

本來是想記錄一下,C語言中的const是個冒牌貨,但實際上C語言中也不併不能修改const修飾的變量的值。
理論上C語言中是能通過指針間接修改const修飾的變量的值的,但是我實際上測試是並不能

int main(void){
    const int a = 10;
    printf("a = %d\n", a);
    
    int *p = &a;
    *p = 20;
    
    int array[a] ={10,20};
    
    printf("a = %d\n", a);
    printf("*p = %d\n", *p);
    printf("array[1] = %d\n", array[1]);
    
    
    return 0;
}

打印結果

a = 10
a = 10
*p = 20
array = 20

6 枚舉加強

c語言中枚舉的本質就是整型,枚舉變量可以用任意整形賦值
c++ 中不能直接把int值賦給enum類型,只能用枚舉元素初始化

#include <iostream>
using namespace std;
enum season{
    SPR,
    SUM,
    AUT,
    WIN
};

int main(void){
    enum season s = SPR;
    cout << "s = " << s << endl;
    // s = 0; error:Assigning to 'enum season' from incompatible type 'int'
    s = SUM;
    cout << "s = " << s << endl;
    return 0;
}

打印結果

s = 0
s = 1

7 命名空間

7.1 命名空間的使用

(1) 直接用std::cout 方式

#include <stdio.h>
#include <iostream>


int main(void){
    std::cout << "hello world" << std::endl;
    return 0;
}

輸出結果

Hello world

(2) 使用using namesapce std 方式

using namespace std;
int main(void){
    cout << "Hello world" << endl;
    return 0;
}

輸出結果

Hello world

(3) 使用std::cout

using std::cout;
int main(void){
    cout << "Hello world" << std::endl;
    return 0;
}

輸出結果

Hello world

7.2 自定義命名空間

(1) 定義一個命名空間

namespace China {
    int peopleSize = 14;
}

using namespace std;
int main(void){
    using namespace China;
    std::cout << " China::peopleSize = " << China::peopleSize<< std::endl;
    return 0;
}

輸出結果

 China::peopleSize = 14

(2) 命名空間嵌套

namespace China {
    int peopleSize = 14;
    
    namespace HeiBei{
        int peopleSize = 5;
    }
}

using namespace std;
int main(void){
    using namespace China;
    std::cout << " China::HeiBei::peopleSize = " << China::HeiBei::peopleSize<< std::endl;
    return 0;
}

輸出結果

 China::HeiBei::peopleSize = 5

8 C++中所有變量和函數都必須有類型

(1) c++中類型檢測加強

#include <iostream>

// c++中函數不加返回值類型報錯 error:Unknown type name 'f'
// c++中函數參數不加類型報錯 error:Unknown type name 'i'
f(i){
    printf("i = d% \n",i);
};

(2) 在c語言中 int f() 表示接收任意參數的函數

void f_2(){
    printf("method f_2()\n");
};

int main(void){
    f_2(10);
    return 0;
}

輸出結果

method f_2()

(3) c語言中,int f(void)表示無參函數

void f_3(void){
    printf("method f_3(void)\n");
}

int main(void){
//    f_3(10);  error: Too many arguments to function call, expected 0, have 1
    return 0;
}

c++中,int f() 和 int f(void)具有相同的意義,都表示返回值爲int的無參函數

9 三目運算符功能增強

  • C語言中三目運算符返回變量的值,所以不可以作爲左直
  • C++語言返回的是變量本身,所以可以作爲左值
#include <iostream>
int main(void){
    int a = 10;
    int b = 20;
    
    int min_value = 0;
    
    (a < b ? a : b) = 30;
    
    printf("a = %d,b = %d \n", a, b);
    return 0;
}

輸出結果

a = 30,b = 20 

原理:C++編譯器做了一個取地址的操作

*(a < b ? &a : &b) = 30;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章