C++-01、特性、常量、引用、重載、布爾

// #include <stdio.h> // C語言的標準支持

#include <iostream> // C++標準支持  C++的與衆不同

using namespace std; // 命名空間 C++ 的特性 (Java語言的內部類)

int main() {
    // C++語言面向對象 + 標準特性
    // C語言面向過程,函數+結構體
    // C++裏面可以運行C語言,可以調用C語言,反之 就不行C語言無法運行C++
    // 小故事:謠言 C++--  在C語言上增加好的內容

    // C++裏面可以運行C語言,可以調用C語言,反之 就不行C語言無法運行C++
    printf("降龍十八掌(C版)\n");

    // std::cout << "C++語言的學習" << std::endl;
    cout << "C++語言的學習" << endl; // 因爲你前面引入了命名空間,省略std::

    // endl == \n  都是換行的含義一樣

    // Kotlin也有操作符重載, Kotlin就是各個語言的精華所在

    // << 不是屬性裏面的運算,操作符重載,後面會講
    cout << "擒龍功" << endl;

    cout << "鐵頭功\n"
         << "金剛腿\n"
         << "鐵布衫\n";

    return 0;
}
真常量
#include <iostream>

// C++語言的常量,其實是真常量,C常量還是可以修改值
int main() {
    const int number = 100;

    // number = 200;

    // 我的編譯器,編譯不通過, 有的編譯器,編譯通過,但是運行報錯(結論:就不能改)
    // int * numP = &number;

    // *numP = 10000;

    printf("%d\n", number);

    return 0;
}
引用(引用的賦值或者傳遞相當於指針取了個別名,不管如何操作這個別名,操作的還是這個指針)
#include <iostream>

using namespace std;

// 互換兩個數

// 指針取地址 互換  C語言第一節課的內容
// 接收number1/number2的地址,取改地址的值,來完成的互換
void numberChange(int * number1, int * number2) {
    int temp = 0;
    temp = *number1;
    *number1 = *number2;
    *number2 = temp;
}

// C++提倡的引用
void numberChange2(int & number1, int & number2) {

    // 如果不採用引用,main numberChange2 內存地址是不一樣的
    // 如果採用引用,main numberChange2 內存地址是一樣的,爲什麼呢?
    cout << "numberChange2 " << "n1地址:" << &number1 << " , n2地址:" << &number2 <<endl;

    int temp = 0;
    temp = number1;
    number1 = number2;
    number2 = temp;
}

int main() {

    int number1 = 10;
    int number2 = 20;

    cout << "main " << "n1地址:" << &number1 << " , n2地址:" << &number2 <<endl;

    // numberChange(&number1, &number2);
    numberChange2(number1, number2);

    cout << "n1:" << number1 << " , n2:" <<  number2 << endl;

    cout << endl;

    // 引用做實驗,來學原理:

    // 第一部分,不採用 &
    /*int n1 = 999;
    int n2 = n1;
    cout << &n1 << "---" << &n2 << endl;*/ // 0xffffcbb4---0xffffcbb0

    // 第二部分,採用&
    int n1 = 999;
    int & n2 = n1;
    int & n9 = n1;
    n2 = 777;
    n9 = 9527;
    cout << "地址:" << &n1 << "---" << &n2 << endl;
    cout << "值:" << n1 << "---" << n2 << endl;

    return 0;
}


常量引用
#include <iostream>
#include <string.h>

using namespace std;

// 代碼的統一性
typedef struct {
    char name[20];
    int age;
}Student;

// 常量引用:Student不准你改 == const Student &
// 插入數據庫,Student的信息給插入數據庫
void insertStudent(const Student & student) {
    // 內鬼 臥底
    // strcpy(student.name, "李元霸"); 不能這樣修改

    Student student2 = {"劉奮", 43};
    // student = student2; 不能這樣修改

    // 只讀的了,可以安心插入數據庫了
    cout << student.name << "," << student.age << endl;
}

int main() {

    // 用戶提交的Student數據
    Student student = {"張無忌", 30};
    insertStudent(student);

    return 0;
}
指針常量 常量指針 常量指針常量
#include <iostream>
#include <string.h>
#include <string.h>

using namespace std;

int main() {

    // *strcpy (char *__restrict, const char *__restrict);
    // strcpy()


    int number = 9;
    int number2 = 8;

    // 大道至簡 一分鐘搞定

    // 常量指針
    const int * numberP1 = &number;
    // *numberP1 = 100; // 報錯,不允許去修改【常量指針】存放地址所對應的值
    // numberP1 = &number2; // OK,允許重新指向【常量指針】存放的地址

    //  指針常量
    int* const numberP2 = &number;
    *numberP2 = 100; // OK,允許去修改【指針常量】存放地址所對應的值
    // numberP2 = &number2; // 報錯,不允許重新指向【指針常量】存放的地址

    // 常量指針常量
    const int * const numberP3 = &number;
    // *numberP3 = 100; // 報錯,不允許去修改【常量指針常量】存放地址所對應的值
    // numberP3 = &number2; // 報錯,不允許重新指向【常量指針常量】存放的地址

    return 0;
}


重載
// C++語言的函數重載 是支持的

#include <iostream>

using namespace std;

// Java構造函數  50個字段,我真正使用的,只有6個
// 建造者設計模式 去解決此問題

// int add(int number1, int number2) = number1 + number2; // 這個是KT寫法

int add(int number1) {
    return number1;
}

int add(int number1, int number2) {
    return number1 + number2;
}

// C++重載 == Java重載
int add(int number1, int number2, int number3) {
    return number1 + number2 + number3;
}

// 函數重載 二義性
// 自己做實驗
// 默認行參賦值,   // KT也有默認行參賦值   優先尋找默認行參賦值的函數, 跟順序無關
int add(double n1 = 100, int n2 = 200, int n3 = 300, int n4 = 400, bool isOK = 0) {
    return 0;
}

// 後面:函數順序的問題?

int main() {
    add(999);

    add(999, 777);

    add(100, 200, 888);

    return 0;
}


系統源碼裏面大量的寫法 [特殊寫法,意義何在]
#include <iostream>

using namespace std;

// 前期先抽象出現,我後面再升級
// 後面你可以擴展
void JNIMethod(double, double, int, int) {

}

// 上層日誌
// 我前期的時候,沒有考慮好,爲了防止擴展功能,你必須傳遞一個int類型參數
// 0:服務器同步,   1:友萌服務器同步     2:服務器同步+友萌服務器同步
void uploadLogToEngine(char * logText, int mode) {
    // 普通上傳日誌

    // 半年過後,我再來補這個功能
    if (mode) {

    } else if (mode == 1) {

    }
}

int main(void) {
    // 前面一個月開發功能的時候
    uploadLogToEngine("xxxxx", 0); // 300出地方調用
    uploadLogToEngine("xxxxx", 2); // 600出地方調用
    uploadLogToEngine("xxxxx", 1); // 400出地方調用

    JNIMethod(9.0 ,9.9, 1, 2);

    return 0;

}

C++面向對象
#include "Student.h"

int main() {
    // 規範寫法:要有 頭文件.h .hpp   --   實現文件 .c  cpp

    std::cout << 1 << std::endl;


    // TODO  =======      下面是棧空間

    Student student1; // 棧區開闢空間的

    // 賦值
    student1.setAge(99);
    student1.setName("李連杰");

    cout << "name:" << student1.getName() << " ,age:" << student1.getAge() << endl;


    // TODO  =======      下面是堆空間

    Student * student2 = new Student(); // new/delete

    // 賦值
    student2->setAge(88);
    student2->setName("李元霸");

    cout << "name:" << student2->getName() << " ,age:" << student2->getAge() << endl;

    if (student2)
        delete student2; // 必須手動釋放堆空間的對象student2
        student2 = NULL; // 指向NULL的地址區域
        // free(student2); // 不能這樣寫,不規範,會被鄙視的

    return 0;


    // 以後學習C++的時候,可能沒有寫頭文件,是不規範的,只是爲了講課
    // 真實開發過程中,必須規範來:
    // 正規的流程:【xxx.so(C/Cpp的實現代碼) 用戶拿到xxx.so】, 頭文件


} // main函數彈棧後,會釋放棧成員 student1


bool 非零即true
#include <iostream>

using namespace std; // std 是系統的,必須這樣叫

int main() {

    // bool  isOK = 1; // !0 就true
    // bool  isOK = -8891; // !0 就true
    // bool  isOK = 4359; // !0 就true
    bool  isOK = 0; // 0 就false

    // 只有兩個類型: !0   0
    // 和前面的C一模一樣

    if (isOK) {
        cout << "真" << endl;
    } else {
        cout << "假" << endl;
    }

    // ==========================
    bool isRun = true;
    isRun = false;
    cout << isRun << endl; // true==1,   false=0

    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章