C++:1.初识C++
📅 2026/7/26 6:27:27
👁️ 阅读次数
📝 编程学习
一、输入输出
- 头文件要求
C++标准输入输出必须包含
#include<iostream>usingnamespacestd;- cout输出
作用:代替C语言的printf,用来打印数据。
特点:
- 不用写格式控制符(%d,%s,%c)
- 自动识别数据类型
- 示例:
cout<<"Hello World!"<<endl;- cin输入
作用:代替C语言中的scanf,用来接受用户输入。
特点:
- 不要格式符
- 自动匹配变量类型
- 示例:
cin>>data;cout<<"data = "<<data<<endl;- endl作用
- 换行
- 刷新缓冲区(C++独有)
- cin/cout优缺点总结
优点
- 写法简单、不用记格式符
- 自动识别类型,不容易报错
- 支持连续输入输出
缺点 - 速度比 scanf/printf 略慢(大数据量场景优先C)
- 练习:猜数字
#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;intmain(){srand(time(0));//种种子intdata=rand()%1000+1;intcount=10;intinputData;boolis_win=false;while(count--){cout<<"input data:"<<endl;cin>>inputData;if(inputData>data){cout<<"大了"<<endl;}elseif(inputData<data){cout<<"小了"<<endl;}else{cout<<"对了"<<endl;is_win=true;break;}}if(!is_win){cout<<"失败了"<<endl;}return0;}二、C和C++的区别
- 文件后缀区分
- C语言
源文件: .c
头文件: .h - C++语言
源文件: .cpp / .cc / .cxx
头文件: .hpp
本质区别:后缀决定编译器按 C 语法 还是 C++ 语法解析代码。
- 函数默认参数
C++ 允许函数参数设置默认值,传参从右往左匹配,不能跳过右边默认参数只传左边。
示例:
voidfun(inta,intb=10){<" "<b;}intmain(){fun(1);// a=1,b使用默认值10return0;}错误写法:
// 错误!靠左参数不能有默认值voidfun(inta=10,intb);总结:
C:无默认参数
C++:支持从右向左参数匹配
- inline内联函数(C++优化特性)
- 原理
普通函数调用流程:
调用函数 → 压栈 → 跳转执行 → 返回 → 出栈
频繁调用小函数会有巨大开销 - inline 作用:
编译阶段直接把函数代码复制粘贴到调用处,消除跳转开销。 - 规则
1.inline 只是建议,不是强制
2.复杂函数、递归函数,编译器会自动拒绝内联
3.适合:代码短、频繁调用的函数
示例
inlineintsum(inta,intb)// 内联函数{returna+b;}intmain(){intdata=0;for(inti=0;i<100000;i++){data=sum(data,i);// data = data + i;}cout<<data<<endl;return0;}- 函数重载
- 概念
同一作用域,函数名相同,参数个数/类型不同,构成重载。
示例
voidfun(inta);voidfun(inta,intb);voidfun(doublea);- C语言
编译后只保留函数名
同名函数直接冲突,不支持重载
例如 void fun(int) 编译后符号就是: fun - C++语言
编译后符号 = 函数名 + 参数信息
同名不同参,符号不同,不会冲突
例如:
fun(int) → fun_i
fun(int,int) → fun_ii
所以 C++ 可以重载。 - extern “C”{函数声明;}
作用:强制这段代码按C规则编译,不生成重载符号,兼容C项目。
- 引用
1.概念:引用 = 变量别名,底层本质是指针,但是更安全、更简洁
语法示例:
inta=10;int&b=a;//b是a的别名2.引用必须初始化
指针可以不初始化,引用定义必须绑定一个变量,无空引用。
3.引用一旦绑定,终身不变
inta=10,b=20;int&x=a;x=b;// 只是赋值,不是改变指向!引用不能改变指向,杜绝野指针问题。
4.底层本质
int&b=a;//编译器底层等价于:int*constb=&a;引用不能改指向,可以改值。
5.指针vs引用
指针:可空、可改指向、危险、灵活
引用:不可空、不可改指向、安全、简洁
6.对比以下两种写法
#include<iostream>#include<cstring>#include<cstdlib>usingnamespacestd;voidGetMemory(char**q){// 指针的指针(二级指针)*q=(char*)malloc(1024);}intmain(){char*p=NULL;GetMemory(&p);// 要传p的地址strcpy(p,"hello world");cout<<p<<endl;free(p);return0;}✅ 说明: char** q 是二级指针, *q 就是对 p 的解引用,修改 *q 会改变 p 的值,也能成功分配内存。
#include<iostream>#include<cstring>#include<cstdlib>usingnamespacestd;voidGetMemory(char*&q){// 指针的引用q=(char*)malloc(1024);}intmain(){char*p=NULL;GetMemory(p);strcpy(p,"hello world");cout<<p<<endl;free(p);return0;}✅ 说明: char*& q 是对指针 p 的引用,函数内修改 q 就是直接修改 p ,所以 p 能拿到分配的内存地址,程序正常运行。
7.两种方式的对比
- 指针的引用( char*& ):C++ 写法,更直观,不用取地址 &p 。
- 二级指针( char** ):C/C++ 都支持,需要显式传 &p ,语法稍繁琐。
这两种写法都能让程序正常打印 hello world ,不会出现内存错误。
8.数组指针的引用
voidfunc(int(*p)[10])//数组指针来接受,数组大小一定要写,不然不能进行+1操作{}intmain(){inta[10]={0};func(&a);// a->int* &a->(*)[10]数组指针cout<<sizeof(a)<<endl;//计算整个数组大小4*10=40cout<<sizeof(&a[0])<<endl;//首元素地址,为int*类型,32位系统中为4,64位中为8int*p=a;// &acout<<sizeof(p)<<endl;//也是int*类型,32位系统中为4,64位中为8// 引用变量引用a &a;//int *b = &a;int(*b)[10]=&a;cout<<b<<" "<<(b+1)<<endl;}9.引用实现冒泡排序
#define_CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdlib>#include<ctime>usingnamespacestd;voidbubbleSort(int(&arr)[20],intsize){intflag;for(inti=0;i<size-1;i++){flag=0;for(intj=0;j<size-1-i;j++){if(arr[j]>arr[j+1]){inttmp=arr[j];arr[j]=arr[j+1];arr[j+1]=tmp;flag=1;}}if(flag==0){break;}}}intmain(){srand(time(0));intarr[20]={0};for(inti=0;i<20;i++){arr[i]=rand()%100;}bubbleSort(arr,20);for(inti=0;i<20;i++){cout<<arr[i]<<" ";}cout<<endl;return0;}
编程学习
技术分享
实战经验