【C++】入门



2021年12月11日    Author:Guofei

文章归类: C    文章编号: 11001

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2021/12/11/cpp1.html


用c还是c++?

如果你想对编译后的机器指令做精准控制,应当用c。C++编译器会偷偷插入太多东西

C++ 与 C 的区别

  1. 面向对象编程:C++支持面向对象编程,而C语言不支持。
  2. 类和对象:C++中可以定义类和对象,而C语言不支持。
  3. 继承和多态:C++支持继承和多态,而C语言不支持。
  4. 模板:C++提供了模板这一特性,可以通过模板实现泛型编程,而C语言不支持。
  5. 异常处理:C++支持异常处理机制,可以在程序出现异常时进行处理,而C语言不支持。
  6. STL:C++标准库中提供了STL(标准模板库),包括容器、算法和迭代器等,而C语言没有这样的库。
  7. 命名空间:C++中可以使用命名空间来避免命名冲突,而C语言不支持。

编译用 g++ 命令,而不是 gcc

g++ -o main main1.cpp

在堆里分配内存

char *p = malloc(20); // 在 C 中可以

// malloc 返回的是 void *
char *p = (char *) malloc(20); // 在 C++ 中,指针的类型必须相同,才能赋值


// C++ 更多的是这么做:
char *p1 = new char; // 在堆中分配了1个char
delete p1; // 释放内存

char *p = new char[100]; // 在堆中分配 char[100]
delete[]p;//释放数组内存

C++可以用函数的重载

int test(int a) {
    printf("test1: %d\n", a);
    return 0;
}

int test(int a, int b) {
    printf("test2: %d, %d\n", a, b);
    return 1;
}


int main() {
    test(1);
    test(1, 2);
    return 0;
}

C++函数形参可以指定一个缺省值

int test(int a = 10) {
    printf("test1: %d\n", a);
    return 0;
}

int main() {
    test(1);
    test();
    return 0;
}

面向对象

结构体

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct student {
    char name[20];
    int age;

//    要点1. 可以在struct 中指定一个函数
    void set_name(const char *p) {
        strcpy(name, p);
    }

    const char *get_name() {
        return name;
    }

//    要点2. 可以指定构造函数,也可以不要
    student() {
        printf("构造函数\n");
    }


//  要点3:  构造函数也可以重载
// 要点4:构造函数可以设定默认值
    student(const char *p, int a = 10) {
        printf("重载构造函数\n");
        strcpy(name, p);
        age = a;
    }

//    要点5:析构函数,只能有1个,并且没有入参
    ~student() {
        printf("析构函数,销毁时调用\n");
    }
};

int main() {
    student st;// 构造方式1: 等价于 struct student st;

    st.set_name("张三");
    printf("%s\n", st.get_name());

    student st2("李四"); //构造方式2:调用构造函数
    printf("%s, %d\n", st2.get_name(), st2.age);

    // 构造方式3:在堆里面分配内存
    student *st3 = new student("王二", 30);
    printf("%s, %d\n", st3->get_name(), st3->age);
    delete st3; //必须释放内存,不然结束时不会调用 析构函数
}

析构函数的用途:如果结构体中用了 malloc 或者 new char[20] 那么需要在析构函数中释放内存。

在main函数之前执行一个函数

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct A {
    A() {
        int a = 1;
        printf("执行main函数之前,就能执行, %d\n", a);
    }
};

A a;

int main() {
    printf("main\n");

    return 0;
}

this

struct student {
    int age;

    // this 是指针,指向自己
    student *get_addr() {
        return this;
    }

    void set_age(int age = 20) {
        this->age = age; // this可以解决同名赋值的问题
    }
};


int main() {

    student st1;
    printf("%p == %p\n", st1.get_addr(), &st1);

    st1.set_age(20);
    return 0;
}

class

用法与 struct 几乎一样,只需要

  1. 把 struct 改成 class,
  2. 加一个 public 关键词
  3. 其实也有private 关键词
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

class student {
public:
    char name[20];
    int age;

//    要点1. 可以在struct 中指定一个函数
    void set_name(const char *p) {
        strcpy(name, p);
    }

    const char *get_name() {
        return name;
    }

//    要点2. 可以指定构造函数,也可以不要
    student() {
        printf("构造函数\n");
    }


//  要点3:  构造函数也可以重载
// 要点4:构造函数可以设定默认值
    student(const char *p, int a = 10) {
        printf("重载构造函数\n");
        strcpy(name, p);
        age = a;
    }

//    要点5:析构函数,只能有1个,并且没有入参
    ~student() {
        printf("析构函数,销毁时调用\n");
    }
};

int main() {
    student st;// 构造方式1: 等价于 struct student st;

    st.set_name("张三");
    printf("%s\n", st.get_name());

    student st2("李四"); //构造方式2:调用构造函数
    printf("%s, %d\n", st2.get_name(), st2.age);

    // 构造方式3:在堆里面分配内存
    student *st3 = new student("王二", 30);
    printf("%s, %d\n", st3->get_name(), st3->age);
    delete st3; //必须释放内存,不然结束时不会调用 析构函数
}

您的支持将鼓励我继续创作!