C++ 入门核心语法|从 Hello World 到基础特性一次性吃透
文章目录
- 前言
- 一、C++ 第一个程序:Hello World
- 二、命名空间 namespace
- 1. 为什么需要命名空间?
- 2. 命名空间定义规则
- 3. 三种使用方式
- 三、C++ 输入 & 输出
- 1. 核心对象
- 2. 最大优势
- 四、缺省参数(默认参数)
- 1. 定义
- 2. 使用方式
- 3. 声明与定义分离规则
- 五、函数重载(C++ 重要特性)
- 1. 定义
- 2. 示例
- 3. 与缺省函数某些情况矛盾
- 六、 引用 &(C++ 最常用语法)
- 1 定义
- 2. 引用三大特性
- 3. 引用的用途
- 4. const 引用(权限问题)
- 5. 临时对象必须用 const 引用
- 6. 引用 vs 指针(高频面试)
- 七、inline 内联函数(替代宏)
- 1. 作用
- 2. 特点
- 八、 nullptr(C++11 空指针)
- 1. 问题
- 2.解决方案
- 3. 与C的差异
- 总结
前言
最近开始系统学习 C++,整理了一份超全的入门基础笔记,专注新手最该掌握的知识点与核心语法,适合零基础入门或快速复习,直接干货奉上~
一、C++ 第一个程序:Hello World
C++ 完全兼容 C,C程序能写过的,在C++上依旧可以通过,两种写法都能跑:
// C风格#include<stdio.h>intmain(){printf("hello world\n");return0;}// C++风格#include<iostream>usingnamespacestd;intmain(){cout<<"hello world"<<endl;return0;}注:VS上要将后缀改为.cpp,编译器才知道是C++
二、命名空间 namespace
1. 为什么需要命名空间?
不知道大家在用C写程序的时候会不会遇到一个烦恼,就是写了程序很长的时候,一不小心就重定义了一个变量名或者函数名。而C++为了避免这种情况,引出了一个叫命名空间的概念。就是为了解决全局命名冲突、名字污染这种情况。
C 语言项目中变量 / 函数名和库函数重名是常态,会直接编译报错:
#include<stdio.h>#include<stdlib.h>intrand=10;// 与库函数 rand 冲突intmain(){printf("%d\n",rand);// 编译报错return0;}但如果使用命名空间就不会出现问题:
#include<stdio.h>#include<stdlib.h>namespacebit{intrand=10;}intmain(){printf("%d\n",bit::rand);return0;}2. 命名空间定义规则
namespace空间名{// 可定义:变量、函数、类型intx;voidfunc(){}structNode{};}- namespace 只能定义在全局
- 可以嵌套定义
- 多个文件同名命名空间会自动合并(命名空间可以跨文件使用,不受文件限制,注意包含头文件)
- 标准库都在 std 内(因此在调用C++标准库的时候必须使用std命名空间)
所以
#include<iostream>在编译时展开等价于
namespacestd{//////标准库文件};3. 三种使用方式
① 指定访问
namespacebit{inta=10;}intmain(){cout<<bit::a<<endl;}② 展开单个成员
usingbit::a;cout<<a<<endl;③ 展开整个空间(仅练习用)
usingnamespacebit;项目严禁展开整个 std,极易冲突!
三、C++ 输入 & 输出
头文件:#include<iostream>
1. 核心对象
- cin:标准输入(键盘)
- cout:标准输出(屏幕)
- endl:换行 + 刷新缓冲区
- <<:流插入运算符
- >>:流提取运算符
2. 最大优势
与C++的输入输出的区别就是C++里面提供的输入输出可以自动识别类型,非常方便,就省去占位符。自动识别变量类型,不需要 %d、%f、%lf。
inta;doubleb;charc;cin>>a>>b>>c;cout<<a<<" "<<b<<" "<<c<<endl;注:虽然C++的输入输出方便,但在性能上也做出了牺牲,会比C提供的输入输出更慢一点,在竞赛时可能就有超时的风险,且C++的输入输出不好像C一样去控制格式,综合来说有利也有弊。
四、缺省参数(默认参数)
1. 定义
声明函数时给参数一个默认值,调用不传参则使用默认值。
2. 使用方式
①全缺省
voidFunc(inta=10,intb=20,intc=30){cout<<a<<" "<<b<<" "<<c<<endl;}② 半缺省(重点)
必须从右往左连续缺省,不能跳!
// 正确voidFunc(inta,intb=10,intc=20);// 错误voidFunc(inta=10,intb,intc=20);注:调用缺省函数时只能从左向右依次给实参(和半缺省对应)
3. 声明与定义分离规则
缺省值只能写在声明里!
// Stack.hvoidSTInit(ST*ps,intn=4);// Stack.cppvoidSTInit(ST*ps,intn){// ...}五、函数重载(C++ 重要特性)
1. 定义
同一作用域:函数名相同,参数不同 → 构成重载
参数不同指:
- 类型不同
- 个数不同
- 类型顺序不同
返回值不同不能构成重载!
2. 示例
// 1. 类型不同intAdd(inta,intb);doubleAdd(doublea,doubleb);// 2. 个数不同voidf();voidf(inta);// 3. 顺序不同voidf(inta,charb);voidf(charb,inta);3. 与缺省函数某些情况矛盾
#include<iostream>using namespace std;voidf1(){cout<<"f()"<<endl;}voidf1(inta=10){cout<<"f(int a)"<<endl;}intmain(){f1();// f()调⽤时,会报错,存在歧义,编译器不知道调⽤谁return0;}解决方法:将两个放在不同的命名空间中,但放在不同的命名空间中就不是函数重载了
#include<iostream>using namespace std;namespace kind{voidf1(){cout<<"f()"<<endl;}};voidf1(inta=10){cout<<"f(int a)"<<endl;}intmain(){kind::f1();return0;}六、 引用 &(C++ 最常用语法)
1 定义
引用不是新定义⼀个变量,而是给已存在变量取了⼀个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同⼀块内存空间。比如:水壶传中李逵,宋江叫"铁牛",江湖上人称"黑旋风";林冲,外号豹子头;
引用是变量的别名,不开辟新空间,和原变量共用同一块内存。(底层还是使用指针实现,但语法层面默认不开空间)
语法:
类型&别名=实体;示例:
inta=10;int&b=a;int&c=b;// 多级别名2. 引用三大特性
- 定义时必须初始化
- 一个变量可以有多个引用(一个人可以有多个小名)
- 一旦绑定,不能改变指向
inta=10;int&b=a;intc=20;b=c;// 这是赋值,不是修改引用指向!3. 引用的用途
① 引用传参(替代指针)
voidSwap(int&rx,int&ry){inttmp=rx;rx=ry;ry=tmp;}② 引用返回值(减少拷贝)
int&STTop(ST&rs){returnrs.a[rs.top];}可以直接修改返回值:STTop(st) += 10;
可以理解为:
- 返回值就是返回一个常量数值,不能修改原变量。
- 返回引用就是返回原变量,可以修改原变量。
注:不能返回局部变量的引用,会变成类似空指针的东西
4. const 引用(权限问题)
- 权限可以缩小
- 权限不能放大
constinta=10;// int& ra = a; // 错误:权限放大constint&ra=a;// 正确intb=20;constint&rb=b;// 正确:权限缩小
注:int&这种形式就代表可读可写,const int&这种代表只读不写
5. 临时对象必须用 const 引用
- 常量,表达式,类型转换的结果会保存在⼀个临时对象中,⽽C++规定临时对象具有常性,所以这里就触发了权限放⼤,必须要⽤常引⽤才可以。
- 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象,C++中把这个未命名对象叫做临时对象
constint&r=10;constint&r=a*3;constint&r=12.34;6. 引用 vs 指针(高频面试)
- 语法概念上引⽤是⼀个变量的取别名不开空间,指针是存储⼀个变量地址,要开空间。
- 引用必须初始化,指针不用
- 引用不能改变指向,指针可以
- 引⽤可以直接访问指向对象,指针需要解引⽤才是访问指向对象。
- 指针很容易出现空指针和野指针的问题,引⽤很少出现,引⽤使⽤起来相对更安全⼀些
- sizeof(引用) = 类型大小;sizeof(指针) = 4/8 字节
七、inline 内联函数(替代宏)
1. 作用
替代 C 语言宏函数,编译时在调用处展开,无栈帧开销,提高高频小函数效率。
inlineintAdd(intx,inty){returnx+y;}2. 特点
- inline 是编译器建议,不是强制
- 递归函数、代码长函数会被忽略
- 声明与定义不能分离,否则链接错误
八、 nullptr(C++11 空指针)
1. 问题
C++ 中 NULL 是 0,重载函数会调用错误版本。
voidf(intx){cout<<"int"<<endl;}voidf(int*ptr){cout<<"int*"<<endl;}f(NULL);// 调用 f(int),错误2.解决方案
使用 nullptr,专门表示空指针。
f(nullptr);// 调用 f(int*),正确3. 与C的差异
#include<iostream>usingnamespacestd;intmain(){inta=0;double*s=&a;return0;}上述代码在C中能通过,但在C++不能因为C++存在严格的类型判定,连指针都要类型一致(C中指针会发生隐式转换)
C++中nullptr它可以转换成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问提·。所以在C++中都要将NULL改为nullptr。
总结:
- C++中nullptr可以给予任意指针。
- void * 依旧可以接受任意指针。
- C++中有严格的类型判定。
总结
- namespace 解决命名冲突,项目用 域::成员
- cin/cout 自动识别类型
- 缺省参数从右往左连续给,声明给缺省值
- 函数重载看参数,不看返回值
- 引用是别名,常用来传参、返回值,权限可缩不可放
- inline 替代宏,短小高频函数使用
- C++11 空指针统一用 nullptr
以上就是该篇博客的内容了,如果内容存在不足,请大佬多多包涵并不吝赐教,会在写出优秀好文的路上努力拼搏达,感谢支持!!!
一键三连。1感谢佬们的支持😄
点赞,关注,收藏qwq感谢佬佬们↩︎
