用c还是c++?
如果你想对编译后的机器指令做精准控制,应当用c。C++编译器会偷偷插入太多东西
C++ 与 C 的区别
- 面向对象编程:C++支持面向对象编程,而C语言不支持。
- 类和对象:C++中可以定义类和对象,而C语言不支持。
- 继承和多态:C++支持继承和多态,而C语言不支持。
- 模板:C++提供了模板这一特性,可以通过模板实现泛型编程,而C语言不支持。
- 异常处理:C++支持异常处理机制,可以在程序出现异常时进行处理,而C语言不支持。
- STL:C++标准库中提供了STL(标准模板库),包括容器、算法和迭代器等,而C语言没有这样的库。
- 命名空间: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 几乎一样,只需要
- 把 struct 改成 class,
- 加一个 public 关键词
- 其实也有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; //必须释放内存,不然结束时不会调用 析构函数
}