当前位置: 首页 > news >正文

C++:1.初识C++

一、输入输出

  1. 头文件要求
    C++标准输入输出必须包含
#include<iostream>usingnamespacestd;
  1. cout输出
    作用:代替C语言的printf,用来打印数据。
    特点:
  • 不用写格式控制符(%d,%s,%c)
  • 自动识别数据类型
  • 示例:
cout<<"Hello World!"<<endl;
  1. cin输入
    作用:代替C语言中的scanf,用来接受用户输入。
    特点:
  • 不要格式符
  • 自动匹配变量类型
  • 示例:
cin>>data;cout<<"data = "<<data<<endl;
  1. endl作用
  • 换行
  • 刷新缓冲区(C++独有)
  1. cin/cout优缺点总结
    优点
  • 写法简单、不用记格式符
  • 自动识别类型,不容易报错
  • 支持连续输入输出
    缺点
  • 速度比 scanf/printf 略慢(大数据量场景优先C)
  1. 练习:猜数字
#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++的区别

  1. 文件后缀区分
  • C语言
    源文件: .c
    头文件: .h
  • C++语言
    源文件: .cpp / .cc / .cxx
    头文件: .hpp
    本质区别:后缀决定编译器按 C 语法 还是 C++ 语法解析代码。
  1. 函数默认参数
    C++ 允许函数参数设置默认值,传参从右往左匹配,不能跳过右边默认参数只传左边。
    示例:
voidfun(inta,intb=10){<" "<b;}intmain(){fun(1);// a=1,b使用默认值10return0;}

错误写法:

// 错误!靠左参数不能有默认值voidfun(inta=10,intb);

总结:
C:无默认参数
C++:支持从右向左参数匹配

  1. 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;}
  1. 函数重载
  • 概念
    同一作用域,函数名相同,参数个数/类型不同,构成重载。
    示例
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. 引用

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;}
http://www.jsqmd.com/news/1265734/

相关文章:

  • QSAR模型:从基础原理到AI药物设计实践
  • 摩托车交通违章检测数据集 | 6100张YOLO智慧交通数据集
  • 2026年临沂做抖音找谁比较靠谱?:子鱼传媒效果出众更权威
  • 虹桥红桥落日为邻,住在光明,周末徒步不必奔赴远方
  • Embeddings技术解析:从原理到八大应用场景
  • 深度伪造检测:基于法医思维的多层次AI识别技术
  • Unity新手入门:从零创建3D/2D项目的完整指南与避坑技巧
  • 【claude code实践】MCP Server 的基本概念:工具、资源与上下文扩展
  • YOLO算法在交通标志识别中的优化与实践
  • HarmonyOS TS快速入门(八):真机调试配置与常见问题全攻略
  • Windows下Codex CLI配置优化与问题解决指南
  • 基于Linux系统的C语言基础编程函数篇Day8
  • 多模态检索技术解析:从原理到工程实践
  • 2026小红书免费去水印方法 安全无风险在线工具教程
  • RobotHelper:打造Android游戏自动化的全能开发框架
  • AI辅助学术写作:提升开题报告效率的智能解决方案
  • AI自动化修复Node.js SSL错误:构建智能诊断与修复工作流
  • AI写作助手的可控性优化与提示词工程实践
  • 千笔AI助力继续教育论文写作:痛点解析与智能解决方案
  • Unity热更新实战:基于HybridCLR与YooAsset的纯C#热更框架搭建指南
  • C++推理引擎部署270亿参数大模型:从ONNX导出到性能调优实战
  • 华为万卡训推一体方案:大模型训练与推理的革新架构
  • AI教材编写降重技巧与查重系统应对策略
  • 2026 年新发布:海兴可靠的镀锌护栏板回收工厂找哪家,别再扔了!这批旧护栏板的隐藏变现秘密-沃德交通设施 - 行业推荐官【官方】
  • C++实现数值微分:量化金融与科学计算的核心算法
  • Linux动态壁纸终极指南:免费在Linux上运行Wallpaper Engine壁纸
  • 张量网络在量子机器学习中的高效应用与优化
  • 涂胶显影机(Track)技术岗【技术总监】面试打分卡
  • 储能 PCS 仿真建模方法与模型验证技术详解
  • AI驱动数字孪生建模:效率提升8倍的实战经验