C++学习

  • 1、基础语法
  • 2、核心编程
  • 引用做函数的返回值
  • 引用做函数的返回值
  • 引用做函数的返回值
  • 3、类和对象


1、基础语法

黑马程序员 springboot 黑马程序员c++语言讲义_ci


黑马程序员 springboot 黑马程序员c++语言讲义_ci_02


黑马程序员 springboot 黑马程序员c++语言讲义_ci_03


黑马程序员 springboot 黑马程序员c++语言讲义_ci_04


黑马程序员 springboot 黑马程序员c++语言讲义_c++_05


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_06


最基本的排序算法

黑马程序员 springboot 黑马程序员c++语言讲义_数据_07


黑马程序员 springboot 黑马程序员c++语言讲义_数据_08


黑马程序员 springboot 黑马程序员c++语言讲义_数据_09


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_10


黑马程序员 springboot 黑马程序员c++语言讲义_ci_11


黑马程序员 springboot 黑马程序员c++语言讲义_值传递_12


不声明函数的话,如果函数在主函数后面,调用时可能会报错!!

让代码结构更加清晰

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_13


黑马程序员 springboot 黑马程序员c++语言讲义_ci_14


黑马程序员 springboot 黑马程序员c++语言讲义_c++_15

const修饰后 变成只读,不可修改
const修饰后 变成只读,不可修改
const修饰后 变成只读,不可修改

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_16


(指向的内容10不允许修改)

黑马程序员 springboot 黑马程序员c++语言讲义_数据_17

指针常量 常量指针

黑马程序员 springboot 黑马程序员c++语言讲义_数据_18


指针常量

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_19


黑马程序员 springboot 黑马程序员c++语言讲义_值传递_20


黑马程序员 springboot 黑马程序员c++语言讲义_数据_21

黑马程序员 springboot 黑马程序员c++语言讲义_数据_22

黑马程序员 springboot 黑马程序员c++语言讲义_数据_23

黑马程序员 springboot 黑马程序员c++语言讲义_c++_24

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_25


结构体中const的使用

P69 讲到了 值传递的时候是实参复制一份给形参 如果数据量较大,这样的值传递方式比较占内存空间,使用地址传递的方式更加好,会更加节省内存空间,一个指针只占四个内存

P69 讲到了 值传递的时候是实参复制一份给形参 如果数据量较大,这样的值传递方式比较占内存空间,使用地址传递的方式更加好,会更加节省内存空间,一个指针只占四个内存

P69 讲到了 值传递的时候是实参复制一份给形参 如果数据量较大,这样的值传递方式比较占内存空间,使用地址传递的方式更加好,会更加节省内存空间,一个指针只占四个内存

P69 讲到了 值传递的时候是实参复制一份给形参 如果数据量较大,这样的值传递方式比较占内存空间,使用地址传递的方式更加好,会更加节省内存空间,一个指针只占四个内存

黑马程序员 springboot 黑马程序员c++语言讲义_数据_26

防止函数调用时 实参随着形参改变而改变
防止函数调用时 实参随着形参改变而改变
防止函数调用时 实参随着形参改变而改变

const student *s

黑马程序员 springboot 黑马程序员c++语言讲义_ci_27


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_28

2、核心编程

黑马程序员 springboot 黑马程序员c++语言讲义_ci_29


黑马程序员 springboot 黑马程序员c++语言讲义_ci_30

内存分区

黑马程序员 springboot 黑马程序员c++语言讲义_数据_31


黑马程序员 springboot 黑马程序员c++语言讲义_ci_32


黑马程序员 springboot 黑马程序员c++语言讲义_数据_33


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_34


黑马程序员 springboot 黑马程序员c++语言讲义_ci_35


黑马程序员 springboot 黑马程序员c++语言讲义_数据_36

栈区的数据在函数执行完之后自动释放
栈区的数据在函数执行完之后自动释放
栈区的数据在函数执行完之后自动释放
栈区的数据在函数执行完之后自动释放

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_37


函数执行完之后。变量a的地址上的数据就被擦出了,就没法访问到这个数据了。

函数执行完之后。变量a的地址上的数据就被擦出了,就没法访问到这个数据了。

函数执行完之后。变量a的地址上的数据就被擦出了,就没法访问到这个数据了。

(注意:可能编译器不同,略有差异,但是不能用)

黑马程序员 springboot 黑马程序员c++语言讲义_数据_38


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_39


利用new关键字创建一个堆区的数据

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_40


黑马程序员 springboot 黑马程序员c++语言讲义_值传递_41


黑马程序员 springboot 黑马程序员c++语言讲义_c++_42

引用,可以对变量的引用再进行引用,反正都是起别名,

#include <iostream>

using namespace std;
int main()
{
    int num = 2;
    int &ref1 = num;
    int &ref2 = ref1;
    cout << ref2 << endl;
    num = 3;
    cout << ref2 << endl;
    ref2 = 155;
    cout << ref2 << endl;

    
}

黑马程序员 springboot 黑马程序员c++语言讲义_c++_43


黑马程序员 springboot 黑马程序员c++语言讲义_ci_44


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_45

引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点
引用做形参 这样的话,形参如果改变,则会改变实参 ------------- 比指针做形参简单点

可以简化指针修改实参
可以简化指针修改实参
可以简化指针修改实参
可以简化指针修改实参
可以简化指针修改实参
可以简化指针修改实参
可以简化指针修改实参

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_46


黑马程序员 springboot 黑马程序员c++语言讲义_ci_47

引用做函数返回值

引用做函数的返回值

引用做函数的返回值

引用做函数的返回值

返回本体 return啥 就返回啥(本体)

黑马程序员 springboot 黑马程序员c++语言讲义_数据_48

加个& 就表示按引用的类型进行返回
加个& 就表示按引用的类型进行返回
加个& 就表示按引用的类型进行返回

黑马程序员 springboot 黑马程序员c++语言讲义_c++_49


函数的调用可以作为左值,下面的这个函数返回的是一个引用类型

黑马程序员 springboot 黑马程序员c++语言讲义_ci_50

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_51


普通局部变量(存放在栈区里,子函数执行完,变量就被释放掉了)不可以作为函数的返回值,静态局部变量可以!!!

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_52

常量引用 Const 用const来修饰形参 防止形参改变实参
常量引用 Const 用const来修饰形参
常量引用 Const 用const来修饰形参 防止形参改变实参
常量引用 Const 用const来修饰形参
常量引用 Const 用const来修饰形参 防止形参改变实参
常量引用 Const 用const来修饰形参

黑马程序员 springboot 黑马程序员c++语言讲义_数据_53

10是一个字面量 不可以被引用

黑马程序员 springboot 黑马程序员c++语言讲义_ci_54


加上Const就可以了

黑马程序员 springboot 黑马程序员c++语言讲义_c++_55


防止对形参进行误操作

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_56

函数
特别注意:函数声明和实现的一些注意事项

黑马程序员 springboot 黑马程序员c++语言讲义_c++_57


黑马程序员 springboot 黑马程序员c++语言讲义_ci_58


函数站位参数

黑马程序员 springboot 黑马程序员c++语言讲义_数据_59


占位参数还可以有默认参数

黑马程序员 springboot 黑马程序员c++语言讲义_c++_60


黑马程序员 springboot 黑马程序员c++语言讲义_c++_61


黑马程序员 springboot 黑马程序员c++语言讲义_数据_62

黑马程序员 springboot 黑马程序员c++语言讲义_c++_63

引用作为函数重载

黑马程序员 springboot 黑马程序员c++语言讲义_数据_64


黑马程序员 springboot 黑马程序员c++语言讲义_c++_65


黑马程序员 springboot 黑马程序员c++语言讲义_ci_66


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_67


函数重载遇到默认参数

黑马程序员 springboot 黑马程序员c++语言讲义_数据_68


黑马程序员 springboot 黑马程序员c++语言讲义_c++_69

3、类和对象

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_70


对象有其属性和行为

对象有其属性和行为

对象有其属性和行为

对象有其属性和行为

对象有其属性和行为访问权限 属性(数据成员) 行为(成员函数)

黑马程序员 springboot 黑马程序员c++语言讲义_ci_71


黑马程序员 springboot 黑马程序员c++语言讲义_c++_72


封装的意义
将属性和行为写在一起,表现事物

黑马程序员 springboot 黑马程序员c++语言讲义_ci_73


黑马程序员 springboot 黑马程序员c++语言讲义_数据_74


通过函数给数据成员赋值

黑马程序员 springboot 黑马程序员c++语言讲义_c++_75


黑马程序员 springboot 黑马程序员c++语言讲义_值传递_76

权限 三种

黑马程序员 springboot 黑马程序员c++语言讲义_c++_77


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_78


类内类外是指对于类定义而言的

黑马程序员 springboot 黑马程序员c++语言讲义_c++_79


黑马程序员 springboot 黑马程序员c++语言讲义_数据_80


黑马程序员 springboot 黑马程序员c++语言讲义_c++_81

将成员属性(也就是成员数据)设置为私有

将成员属性(也就是成员数据)设置为私有

将成员属性(也就是成员数据)设置为私有

将成员属性(也就是成员数据)设置为私有

将成员属性(也就是成员数据)设置为私有

将成员属性(也就是成员数据)设置为私有

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_82

通过公开的成员函数来控制读取数据成员

黑马程序员 springboot 黑马程序员c++语言讲义_c++_83


可以使用公共public接口函数(set或者get)对私有数据成员进行操作 读取或者设置

可以使用公共public接口对私有数据成员进行操作 读取或者设置

可以使用公共public接口对私有数据成员进行操作 读取或者设置

可以使用公共public接口对私有数据成员进行操作 读取或者设置用于检测数据的有效性

黑马程序员 springboot 黑马程序员c++语言讲义_ci_84


return 直接返回 结束子函数运行

#include <iostream>
using namespace std;
#include <string>
const double pi = 3.14;
//通过set或者get等公共接口函数函数来控制成员的读取权限
class person
{
    public:
        //设置年龄
        void set(int age1)
        {
            age = age1;
        }
        //读取年龄
        void showage()
        {
            cout << age << endl;
        }

        void showname()
        {
            name = "sss";//先初始化
            cout << name << endl;
        }

        void setlover(string lover1)
        {
            lover = lover1;
        }



    private:
        int age;//可读可写
        string name;//只读
        string lover;//只写
};
int main()
{

    person zhangsan;
    zhangsan.set(15);
    zhangsan.showage();

    return 0;
}

注意:类和结构体也是一种数据类型,只不过是我们自己定义的数据类型

#include <iostream>
using namespace std;
#include <string>


class Point
{
    public:
        void setx(double x1)
        {
            x = x1;
        }
        double getx()
        {
            return x;
        }


        void sety(double y1)
        {
            y = y1;
        }
        double gety()
        {
            return y;
        }

    private:
        double x;
        double y;
};

class Circle
{
    public:
        void setr(double r1)
        {
            r = r1;
        }
        double getr()
        {
            return r;
        }
        void setpoint(Point p)
        {
            point1 = p;
        }
        Point getpoint()
        {
            return point1;
        }


    private:
        Point point1;
        double r;
};

void isIncircle(Point &p,Circle &c)
{
    double distance =
        (p.getx() - c.getpoint().getx()) * (p.getx() - c.getpoint().getx()) + (p.gety() - c.getpoint().gety());
    double r2 = c.getr() * c.getr();

    if(distance==r2)
    {
        cout << "相切" << endl;
    }
    if(distance>r2)
    {
        cout << "相离" << endl;

    }

    if(distance<r2)
    {
        cout << "相交" << endl;
    }
}
int main()
{
    Point point;
    point.setx(-0.2);
    point.sety(0);

    Point point2;
    point2.setx(1);
    point2.sety(0);

    Circle circle;
    circle.setr(1);
    circle.setpoint(point2);

    isIncircle(point, circle);
}

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_85

这个例子按照源文件和头文件分开写,会更好!!!
这个例子按照源文件和头文件分开写,会更好!!!
这个例子按照源文件和头文件分开写,会更好!!!

如下:

Circle.h

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_86

Circle.cpp

黑马程序员 springboot 黑马程序员c++语言讲义_ci_87


Point.h

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_88


Point.cpp

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_89


main.cpp

主要包含全局函数和主函数

#include <iostream>
#include "Point.h"
#include "Point.cpp"

#include "Circle.h"
#include "Circle.cpp"
using namespace std;

void isIncircle(Point &p,Circle &c)
{
    double distance =
        (p.getx() - c.getpoint().getx()) * (p.getx() - c.getpoint().getx()) + (p.gety() - c.getpoint().gety());
    double r2 = c.getr() * c.getr();

    if(distance==r2)
    {
        cout << "相切" << endl;
    }
    if(distance>r2)
    {
        cout << "相离" << endl;

    }

    if(distance<r2)
    {
        cout << "相交" << endl;
    }
}
int main()
{
    Point point;
    point.setx(0.1);
    point.sety(0);

    Point point2;
    point2.setx(1);
    point2.sety(0);

    Circle circle;
    circle.setr(1);
    circle.setpoint(point2);

    isIncircle(point, circle);
}

对象的初始化和清理
通过构造函数和析构函数

黑马程序员 springboot 黑马程序员c++语言讲义_数据_90


黑马程序员 springboot 黑马程序员c++语言讲义_数据_91


黑马程序员 springboot 黑马程序员c++语言讲义_c++_92


把整个main函数都执行完才会执行对象的释放操作,才会执行对象的析构函数

把整个main函数都执行完才会执行对象的释放操作,才会执行对象的析构函数

把整个main函数都执行完才会执行对象的释放操作,才会执行对象的析构函数

对象执行完了 销毁了才会调用析构函数

对象执行完了 销毁了才会调用析构函数

对象执行完了 销毁了才会调用析构函数

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_93


创建对象的时候,构造函数被自动调用,且只有一次

黑马程序员 springboot 黑马程序员c++语言讲义_数据_94


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_95

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_96

const Person &p
const Person &p
const Person &p
const Person &p
const Person &p
const Person &p

复制(拷贝)构造函数

黑马程序员 springboot 黑马程序员c++语言讲义_c++_97


拷贝构造函数

定义看下面例子

黑马程序员 springboot 黑马程序员c++语言讲义_c++_98

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_99

黑马程序员 springboot 黑马程序员c++语言讲义_c++_100

黑马程序员 springboot 黑马程序员c++语言讲义_ci_101

//显示法
    Person p1;
    Person p2 = Person(102);//有参构造
    Person p3 = Person(p2);//拷贝构造

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_102


黑马程序员 springboot 黑马程序员c++语言讲义_c++_103


黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_104


黑马程序员 springboot 黑马程序员c++语言讲义_ci_105


会出现重定义的问题

黑马程序员 springboot 黑马程序员c++语言讲义_值传递_106

拷贝构造函数调用时机

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_107


黑马程序员 springboot 黑马程序员c++语言讲义_数据_108

黑马程序员 springboot 黑马程序员c++语言讲义_c++_109


值传递的本质就是会临时拷贝一个副本出来,这里就是调用其拷贝构造函数拷贝(创建)一个新的副本对象

值传递的本质就是会临时拷贝一个副本出来,这里就是调用其拷贝构造函数拷贝一个新的副本对象

值传递的本质就是会临时拷贝一个副本出来,这里就是调用其拷贝构造函数拷贝一个新的副本对象

值传递的本质就是会临时拷贝一个副本出来,这里就是调用其拷贝构造函数拷贝一个新的副本对象

黑马程序员 springboot 黑马程序员c++语言讲义_c++_110

上面的原因还有个是因为值方式来返回。。

局部变量的特点,函数执行完之后就会被清理掉(也就是释放掉)

拷贝一个新的对象,返回给外面 也就是p
拷贝一个新的对象,返回给外面 也就是p
拷贝一个新的对象,返回给外面 也就是p

黑马程序员 springboot 黑马程序员c++语言讲义_黑马程序员 springboot_111


拷贝构造出一个新的对象,,然后传递给p

黑马程序员 springboot 黑马程序员c++语言讲义_c++_112

黑马程序员 springboot 黑马程序员c++语言讲义_数据_113


vscode就给优化了

vscode就给优化了

vscode就给优化了