C++笔记1•C++入门基础• 📅 发布时间:2026/9/1 13:24:10 👁 浏览次数: 1.C关键字C总计63个关键字C语言32个关键字2.命名空间在C/C中变量、函数和后面要学到的类都是大量存在的这些变量、函数和类的名称将都存在于全局作用域中可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化 以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题的。2.1命名空间的定义定义命名空间需要使用到namespace关键字后面跟命名空间的名字然后接一对{}即可{}中即为命名空间的成员。namespace ns{//成员}2.2命名空间的使用例如using namespace std//全部展开using cout //部分展开1使用using将命名空间中某个成员引入usingN::b;intmain(){printf(%d\n,N::a);printf(%d\n,b);return0;}2使用using namespace命名空间名称 引入usingnamespce N;intmain(){printf(%d\n,N::a);printf(%d\n,b);//printf(%d\n,N::b); 全展开时可以把N::省略Add(10,20);return0;}3.C输入输出采用 cout 输出 cin 输入() endl换行需要调用usingnamespce std;这个命名空间#includeiostream//与C头文件区分也为了正确使用命名空间规定C头文件不带.h// std是C标准库的命名空间名C将标准库的定义实现都放到这个命名空间中using namespacestd;intmain(){int a0coutHello world!!!endl;cina;coutaendl;return0;}//1.cout和cin是全局的流对象endl是特殊的C符号表示换行输出他们都包含在包含 iostream 头文件中。2.是流插入运算符是流提取运算符。3.使用C输入输出更方便不需要像printf/scanf输入输出时那样需要手动控制格式。C的输入输出可以自动识别变量类型。4.实际上cout和cin分别是ostream和istream类型的对象4.缺省函数缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时如果没有指定实参则采用该形参的缺省值否则使用指定的实参。voidFunc(inta0){coutaendl;}intmain(){Func();//没有传参时使用参数的默认值Func(10);//传参时使用指定的实参return0;}(1)参数全缺省voidFunc(inta1,intb2,intc3){couta aendl;coutb bendl;coutc cendl;}(2)参数半缺省voidFunc(inta,intb1,intc2){couta aendl;coutb bendl;coutc cendl;}注意1.半缺省参数必须从右往左依次来给出不能间隔着给2.缺省参数不能在函数声明和定义中同时出现(二选一)//a.hvoidFunc(inta10);// a.cppvoidFunc(inta20){}//注意如果声明与定义位置同时出现恰巧两个位置提供的值不同那编译器就无法确定到底该用那个缺省值所以二选一一般是在声明处进行参数缺省。3.缺省值必须是常量或者全局变量4. C语言不支持编译器不支持C支持5.函数重载1函数重载概念1函数名相同参数不同类型or个数or类型顺序不同2返回值没有要求注意一个函数名定义多个功能函数名相同参数不同参数顺序不同可算不同只是返回值不同不能构成重载例如int addint i long addint m#includeiostream using namespace std; // 1、参数类型不同 int Add(int left, int right) { cout int Add(int left, int right) endl; return left right; } double Add(double left, double right) { cout double Add(double left, double right) endl; return left right; } // 2、参数个数不同 void f() { cout f() endl; } void f(int a) // 3、参数类型顺序不同 void f(int a, char b) { cout f(int a,char b) endl; } void f(char b, int a) { cout f(char b, int a) endl; } int main() { Add(10, 20); Add(10.1, 20.2); f(); f(10); f(10, a); f(a, 10); return 0; }(2) 为什么C支持函数重载而C语言不支持函数重载呢★★★C/C程序运行需要经历以下几步预处理头文件展开、宏替换、条件编译、去掉注释。编译检查语法是否有错误生成汇编代码。汇编将汇编代码翻译为机器可识别的二进制代码。链接将多个目标文件进行链接生成可执行程序。链接这一步就要从符号表里找所调用的函数的地址进行链接。从符号表里找函数的地址从Linux系统来看C程序和C程序的函数命名规则:C程序编译器是gccgcc的函数修饰后名字不变符号表里的就是函数名。C程序编译器是gg的函数修饰后变成【_Z函数长度 函数名类型首字母】所以说在符号表中函数名相同参数不同它们在调用时的地址就不一样也就实现功能就不一样。而C程序函数修饰就是只用函数名若是遇到相同的函数名不管它里面的传的参数是什么编译都不会通过主要是由于C程序和C程序的函数名修饰规则不一样也就造成了C程序支持函数重载C程序不支持。看下图(3) C中能否将一个函数按照C的风格来编译可以需要借用extern “C”extern的作用当C程序和C程序都想去调用C实现的模块静态库或者动态库时C必然是可以直接调用的但是C程序无法调用主要原因就是C程序和C程序的函数命名规则不一致如何让C程序调用呢解决方法就是在C实现的模块前面加上extern “C”此时C程序就可以调用了比如tcmalloc这个c库函数要想让C程序调用它就要加上extern “C” void* tcmalloc(size_t n)此时C程序看到这个库函数前有extern “C”符号表将不对tcmalloc进行修饰C程序是兼容C程序的将会以C程序的规则链接tcmalloc。6.引用1引用概念引用不是新定义一个变量而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空 间它和它引用的变量共用同一块内存空间。类型引用变量名(对象名) 引用实体引用类型必须和引用实体是同种类型的voidTestRef(){inta10;intraa;//定义引用类型printf(%p\n,a);printf(%p\n,ra);}2引用特性1引用在定义时必须初始化2一个变量可以有多个引用3引用一旦引用一个实体再不能引用其他实体voidTestRef(){inta10;int b10;// int ra; //该条语句编译时会出错intraa;// intrab;// 该条语句编译时会出错引用一旦引用一个实体再不能引用其他实体intrraa;printf(%p %p %p\n,a,ra,rra);}3引用的使用1)引用传参数void Swap(int left, int right) { int temp left; left right; right temp; }//可以这样做2)引用传返回值int Count() { static int n 0; n; // ... return n; } //可以这样做int Add(int a, int b) { int c a b; return c; } //不可以这样做注意1如果函数返回时出了函数作用域如果返回对象还在(还没还给系统)则可以使用引用返回如果已经还给系统了则必须使用传值返回。2以值作为参数或者返回值类型在传参和返回期间函数不会直接传递实参或者将变量本身直 接返回而是传递实参或者返回变量的一份临时的拷贝因此用值作为参数或者返回值类型效 率是非常低下的尤其是当参数或者返回值类型非常大时效率就更低4引用的本质1)在语法概念上引用就是一个别名没有独立空间和其引用实体共用同一块空间。2)在底层实现上实际是有空间的因为引用是按照指针方式来实现的。引用在定义时必须初始化指针没有要求。可以简单把引用理解为与实体使用相同的地址空间。7.指针空值nullptr由于在C中 NULL被定义为了宏#define NULL 0所以为了提高代码的健壮性在后续表示指针空值时建议最好使用nullptr8.内联函数inline1概念以inline修饰的函数叫做内联函数编译时C编译器会在调用内联函数的地方展开没有函数调 用建立栈帧的开销内联函数提升程序运行的效率。2优缺点inline是一种以空间换时间的做法如果编译器将函数当成内联函数处理在编译阶段会用函数体替换函数调用缺陷可能会使目标文件变大优势少了调用开销提高程序运行效率。注意:inline不建议声明和定义分离要写在一个文件内,分离会导致链接错误。因为inline被展开就没有函数地址了链接就会找不到。