C++的源文件扩展名是:cpp(c plus plus的简称)
C++程序的入口是main函数(函数即方法,一个意思)
C++完全兼容C语言的语法,很久以前,C++叫做C with classes
◼ C++中常使用cin、cout进行控制台的输入、输出
◼ cin用的右移运算符>>,cout用的是左移运算符<<
◼ endl是换行的意思
◼ 规则
函数名相同
参数个数不同、参数类型不同、参数顺序不同
◼ 注意
返回值类型与函数重载无关
调用函数时,实参的隐式类型转换可能会产生二义性
◼ 本质
采用了name mangling或者叫name decoration技术
1.C++编译器默认会对符号名(变量名、函数名等)进行改编、修饰
2.重载时会生成多个不同的函数名,不同编译器(MSVC、g++)有不同的生成规则
3.通过IDA打开【VS_Release_禁止优化】可以看到
被extern "C"修饰的代码会按照C语言的方式去编译
如果函数同时有声明和实现,要让函数声明被extern "C"修饰,函数实现可以不修饰
由于C、C++编译规则的不同,在C、C++混合开发时,可能会经常出现以下操作
C++在调用C语言API时,需要使用extern "C"修饰C语言的函数声明
有时也会在编写C语言代码中直接使用extern “C” ,这样就可以直接被C++调
C++允许函数设置默认参数,在调用时可以根据情况省略实参。规则如下:
默认参数只能按照右到左的顺序
如果函数同时有声明、实现,默认参数只能放在函数声明中
默认参数的值可以是常量、全局符号(全局变量、函数名)
函数重载、默认参数可能会产生冲突、二义性(建议优先选择使用默认参数)
使用inline修饰函数的声明或者实现,可以使其变成内联函数
建议声明和实现都增加inline修饰
特点
编译器会将函数调用直接展开为函数体代码
可以减少函数调用的开销
会增大代码体积
注意
尽量不要内联超过10行代码的函数
有些函数即使声明为inline,也不一定会被编译器内联,比如递归函数
内联函数和宏,都可以减少函数调用的开销
对比宏,内联函数多了语法检测和函数特性
我们经常使用#ifndef、#define、#endif来防止头文件的内容被重复包含
#pragma once可以防止整个文件的内容被重复包含
区别
#ifndef、#define、#endif受C\C++标准的支持,不受编译器的任何限制
有些编译器不支持#pragma once(较老编译器不支持,如GCC 3.4版本之前),兼容性不够好
#ifndef、#define、#endif可以针对一个文件中的部分代码,而#pragma once只能针对整个文件
在C语言中,使用指针(Pointer)可以间接获取、修改某个变量的值
在C++中,使用引用(Reference)可以起到跟指针类似的功能
int age = 20;
//range就是一个引用
int &range = age;
注意点
引用相当于是变量的别名(基本数据类型、枚举、结构体、类、指针、数组等,都可以有引用)
对引用做计算,就是对引用所指向的变量做计算
在定义的时候就必须初始化,一旦指向了某个变量,就不可以再改变,“从一而终”
可以利用引用初始化另一个引用,相当于某个变量的多个别名
不存在【引用的引用、指向引用的指针、引用数组】
引用存在的价值之一:比指针更安全、函数返回值可以被赋值
const是常量的意思,被其修饰的变量不可修改
如果修饰的是类、结构体(的指针),其成员也不可以更改
以下5个指针分别是什么含义?
int age = 10;
const int *p0 = &age;
int const *p1 = &age;
int *const p2 = &age;
const int *const p3 = &age;
int const *const p4 = &age;
上面的指针问题可以用以下结论来解决:
const修饰的是其右边的内容
常引用(Const Reference)
引用可以被const修饰,这样就无法通过引用修改数据了,可以称为常引用
const必须写在&符号的左边,才能算是常引用
const引用的特点
可以指向临时数据(常量、表达式、函数返回值等)
可以指向不同类型的数据
作为函数参数时(此规则也适用于const指针)
1.可以接受const和非const实参(非const引用,只能接受非const实参)
2.可以跟非const引用构成重载
当常引用指向了不同类型的数据时,会产生临时变量,即引用指向的并不是初始化时的那个变量
常见的2种写法
int array[] = { 10, 20, 30 };
int(&ref1)[3] = array;
int *const &ref2 = array;
表达式
C++的有些表达式是可以被赋值的
int a = 1;
int b = 2;
//赋值给了a
(a = b) = 3;
//赋值给了b
(a < b ? a : b) = 4;
引用的本质
引用的本质就是指针,只是编译器削弱了它的功能,所以引用就是弱化了的指针
一个引用占用一个指针的大小