C++语言学习之面向对象

目录

C语言和C++语言有何区别

C++语言面向对象 + 标准特性

C语言面向过程,函数+结构体

C++里面可以运行C语言,可以调用C语言,反之 就不行C语言无法运行C++

cpp 复制代码
// #include <stdio.h> // C语言的标准支持

#include <iostream> // C++标准支持  C++的与众不同

using namespace std; // 命名空间 C++ 的特性 (Java语言的内部类)

int main() {
    // C++语言面向对象 + 标准特性
    // C语言面向过程,函数+结构体
    // C++里面可以运行C语言,可以调用C语言,反之 就不行C语言无法运行C++
    // 以后我们85%以上 都是 用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;
}
cpp 复制代码
降龙十八掌(C版)
C++语言的学习
擒龙功
铁头功
金刚腿
铁布衫

常量之c的常量与c++常量

C语言的常量,其实是一个假常量,伪命题

c 复制代码
#include <stdio.h>

// C语言的常量,其实是个 假常量(伪命题)
int main() {
    const int number = 100;

    // number = 200;

    int * numP = &number;

    *numP = 10000;

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

    return 0;
}

输出

bash 复制代码
10000

C++语言的常量,其实是真常量

cpp 复制代码
#include <iostream>
int main() {
    const int number = 100;

    // number = 200;

    // 我的编译器,编译不通过, 有的编译器,编译通过,但是运行报错(结论:就不能改)
    // int * numP = &number;

    // *numP = 10000;

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

    return 0;
}

引用的原理与常量引用

c 复制代码
// 3.引用的原理与

#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;
}

不采用引用

采用引用,指向同一个内存地址

c 复制代码
// 常量引用。

#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;
}

函数重载与默认行参,无行参名的特殊写法

C语言不支持函数重载

c 复制代码
// C语言的函数重载 是不支持的

#include <stdio.h>

void add(int number1, int number2) {

}

// error: conflicting types for 'add'  == 已有函数主体
// C语言里面,搞了函数重载,这是不允许的,C++才支持函数重载
/*void add(int number1, int number2, int number3) {

}*/

int main() {

    return 0;
}

C++语言的函数重载 是支持的

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;
}
cpp 复制代码
// 系统源码里面大量的写法 [特殊写法,意义何在]

#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++面向对象

Student.h头文件

cpp 复制代码
#include <iostream>

using namespace std;

// Student.h 头文件  只写声明,不写实现

class Student {

private: // 下面的代码(成员和函数),都是私有
    char * name;
    int age;

public: // 下面的代码(成员和函数),都是公开
    // set get
    void setAge(int age); // 声明函数
    void setName(char * age); // 声明函数
    int getAge(); // 声明函数
    char * getName(); // 声明函数
};
c 复制代码
#include "Student.h"

// 根据 Student.h 头文件 ,写实现

// 和实现头文件那个函数,没有任何关系,相当于另外一个函数
/*void setAge(int age) {

}*/

void Student::setAge(int age) { // 实现函数
    // C++对象指向的是一个指针
    // -> 调用一级指针的成员
    this->age = age;
}

void  Student::setName(char * name) { // 实现函数
    this->name = name;
}
int Student::getAge() { // 实现函数
    return this->age;
}
char * Student:: getName() { // 实现函数
    return this->name;
}
cpp 复制代码
// 5.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++的时候,Derry可能没有写头文件,是不规范的,我只是为了讲课
    // 真实开发过程中,必须规范来:
    // 正规的流程:【xxx.so(C/Cpp的实现代码) 用户拿到xxx.so】, 头文件


} // main函数弹栈后,会释放栈成员 student1

布尔类型,非0即true,0为false

cpp 复制代码
#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;
}
相关推荐
kkkkkkkkk_12011 小时前
【强化学习】09周博磊强化学习纲要学习笔记——第五课上
笔记·深度学习·学习·强化学习
玩c#的小杜同学1 小时前
工业级稳定性:如何利用生产者-消费者模型(BlockingCollection)解决串口/网口高频丢包问题?
笔记·学习·性能优化·c#·软件工程
dc_00121 小时前
“mysqld --initialize --console ”执行不成功情况总结和解决措施
java
一品威客网1 小时前
教育 APP 升级!跨端开发支持“多设备学习,无缝衔接”
学习
瑶光守护者2 小时前
【学习笔记】3GPP NR-NTN 移动性IRAT分析
笔记·学习·卫星通信·nr-ntn
摘星编程2 小时前
解锁Agent智能体的未来:五大实战策略彻底革新人机协作模式
java·开发语言
百块富翁2 小时前
可管控、不重复TraceId解决方案
java·分布式·系统架构
金銀銅鐵2 小时前
浅解 Junit 4 第二篇: Runner 和 ParentRunner
java·junit·单元测试