C与C++的关系
C语言是面向过程的,但C++是面向对象的
面向对象:
封装:将函数、类等进行打包封装
继承:直接将父辈的东西拿过来用,不需要重新定义。C也有
struct person{
char name[20];
int age;
int height;
};
struct student{
struct person per; //继承父辈的东西而不需要重新定义
int score;
};
多态:类似于回调函数,不同类的对象发出相同的消息将会有不同的实现。
C++完全兼容C语言的内容
C++基础
文件后缀为.cpp
头文件为<iostream>
g++ 编译
输入输出流(stream)
输入——cin
cin >> val;
输出——cout
cout << "hello" <<10 < val << endl;
需要在开头写 using namespace std;
若没有写这句,在使用cin和cout、endl时需要在前面加std::
命名空间——namespace
使用目的:解决名词污染,区分不同人写的代码
namespace lisi{
void function(){
cout << "lisi::function" << endl;
}
}
namespace zhangsan{
void function(){
cout << "zhangsan::function" << endl;
}
}
int main(){
lisi::function();
using namespace zhangsan; //使用这句表示,该句以后都是张三中的函数、对象等
function();
}
函数重载
定义:同名不同参,函数名字可以相同,但此时参数列表必须不同
在编译时会在参数名后加上参数类型,让编译通过
反编译:
objdump -D test > a.txt
默认参数
在定义函数时,就给参数赋初值;
在调用函数时若没有传参就会使用默认参数,若传参了就会使用传参的值
默认参数必须要写在正常参数之后
在使用有默认参数的函数调用时,应注意是否会影响函数重载
引用 reference
新的数据类型,是变量的别名,作用类似于指针
引用必须初始化,在创建引用变量时就应指明引用谁,且初始化后指向的对象不能改变
引用传递时,主函数的值会改变
int main(){
// type name val
int val = 10;
int& ref = val;
int* ptr = &val;
val++;
ref++;
cout << val << "::" << ref << endl; //结果都为12
cout << &val << "::" << &ref << endl; //地址也相同
}
指针和引用的区别
指针 | 引用 | |
能否为空 | 可以 | 不可以 |
能否改变指向 | 可以 | 不可以 |
大小 | 4B | 所指向的变量的大小 |
安全性 灵活性 | 引用的安全性更高。因为引用不能改变所指的对象。 指针的灵活性更高。可以改变指向的对象,提高了灵活性,降低了安全性。 |
动态内存——new/delete
int main()
{
char *ptr = new char; //指向没有初始化的char
char *str = new char(10); //指针指向的对象初始化为10
char *btr = new int(); //指向初始化为0的int
char *atr = new char[10]; //有10个char
delete []atr; //在delete后应该将该指针指向空
delete str;
delete ptr;
delete btr;
atr = NULL;
btr = NULL;
ptr = NULL;
str = NULL;
}
new和malloc的区别
new | malloc | |
属性 | 关键字 | 库函数 |
参数 | new会自己计算内存大小 | malloc需要人为赋值大小 |
返回值 | 由new后面跟的类型决定,某些情况下,还可以赋初值,未申请成功时会返回NULL | void * ,需要强制转换为需要的类型 |
释放 | delete name; | free( name ); |
内存区域 | 自由存储区 | 堆 |