C++核心语法快速整理

前言

欢迎来到我的博客

个人主页:北岭敲键盘的荒漠猫-CSDN博客

本文主要为学过多门语言玩家快速入门C++

没有基础的就放弃吧。

全部都是精华,看完能直接上手改别人的项目。

输出内容

std::代表了这里的cout使用的标准库,避免不同库中的相同命名导致混乱

std::cout <<输出内容

右侧可以输出代码执行的结果,字符串,数字

可以多段<<进行拼接

std::endl等价于\n,表示结束语句换行

#include <iostream>int main()
{std::cout << 123+456<<"\n";std::cout << "我喜欢"<< 1+1<<"\n";std::cout << "Hello World!\n"<<"我还有一行哦"<< std::endl;std::cout << "你好你好" << std::endl;
}

变量定义

#include <iostream>
#include <string>int main()
{int a = 5; //整形变量std::string b = "Hello World"; //字符串变量float c = 3.14; //浮点型变量std::cout << a << "\n" << b << "\n" << c;}

 运算符

#include <iostream>
#include <string>int main()
{int a = 5; //整形变量std::string b = "Hello World"; //字符串变量float c = 3.14; //浮点型变量std::cout << a + c << '\n'; //输出a+c的值std::cout << a - c << '\n'; //输出a-c的值std::cout << a * c << '\n'; //输出a*c的值std::cout << a / c << '\n'; //输出a/c的值std::cout << a % 2 << '\n'; //输出a对2取模的值std::cout << a++ << '\n'; //输出a的值并将a加1std::cout << a-- << '\n'; //输出a的值并将a减1std::cout << ++a << '\n'; //输出a的值并将a加2std::cout << --a << '\n'; //输出a的值并将a减2}

条件语句

if-else语句

#include <iostream>int main()
{int a = 5; //整形变量if (a > 10) //判断a是否大于10{std::cout << "a大于10" << std::endl; //输出a大于10}else if (a == 10) //判断a是否等于10{std::cout << "a等于10" << std::endl; //输出a等于10}else //如果a不大于10也不等于10{std::cout << "a小于10" << std::endl; //输出a小于10}
}

switch语句

#include <iostream>int main()
{int a = 5; //整形变量switch (a){case 1:std::cout << "a=1" << std::endl;break;case 2:std::cout << "a=2" << std::endl;break;case 3:std::cout << "a=3" << std::endl;break;case 4:std::cout << "a=4" << std::endl;break;case 5:std::cout << "a=5" << std::endl;break;default:std::cout << "a>5" << std::endl;break;}
}

循环语句

while循环

#include <iostream>int main()
{int a = 5; //整形变量while (a < 10) {std::cout << "a is " << a << std::endl;a++;}
}

do-while循环

#include <iostream>int main()
{int a = 5; //整形变量do{a += 10;} while (a < 10);{std::cout << "a is " << a << std::endl;a++;}
}

for循环

#include <iostream>int main()
{int a = 5; //整形变量for (size_t i = 0; i < a; i++){std::cout << "程序执行了 " << i + 1 << "次!" << std::endl;}
}

循环控制关键字

break;
continue

字符串类型变量

看一眼,然后遇到使用的情况直接查。

需要导入库

#include <string>

1. 创建与赋值

std::string s1;             // 空字符串
std::string s2 = "Hello";   // 直接初始化
std::string s3(5, 'a');     // "aaaaa"(重复字符)
s1 = "World";               // 赋值

2. 拼接与追加

s2 += " World";            // 追加 → "Hello World"
s2.append("!");            // 追加 → "Hello World!"
s2.push_back('!');         // 追加单个字符
std::string s4 = s2 + "123"; // 新建拼接字符串

3. 访问元素

char c1 = s2[0];          // 下标访问(不检查越界)
char c2 = s2.at(1);       // 安全访问(越界抛异常)
s2.front() = 'h';         // 首字符(C++11)
s2.back() = 'D';          // 末字符(C++11)

4. 长度与判空

int len = s2.size();      // 字符数量(等价length())
if (s2.empty()) { ... }   // 是否为空

5. 查找与截取

size_t pos = s2.find("World"); // 首次出现位置(未找到返回npos)
std::string sub = s2.substr(6, 5); // 从位置6截取5字符 → "World"

6. 修改内容

s2.insert(5, " C++");    // 在位置5插入 → "Hello C++ World!!"
s2.replace(6, 3, "Hi");  // 替换位置6开始的3字符 → "Hello Hi World!!"
s2.erase(5, 4);          // 删除位置5开始的4字符 → "Hello World!!"
s2.clear();              // 清空字符串

7. 输入输出

std::cout << s2;              // 输出
std::getline(std::cin, s2);   // 读取整行(包括空格)


8. 遍历字符

for (char ch : s2) {        // 范围for循环(C++11)std::cout << ch;
}

9. 比较与判断

if (s2 == "Hello") { ... }   // 直接比较字符串
if (s2.starts_with("He")) { ... } // 是否以某前缀开头(C++20)

10. 大小写转换

#include <algorithm>
// 转大写
std::transform(s2.begin(), s2.end(), s2.begin(), ::toupper);
// 转小写
std::transform(s2.begin(), s2.end(), s2.begin(), ::tolower);

数组使用

1. 固定大小数组 → std::array

#include <array>
std::array<int, 3> arr = {1, 2, 3}; // 类型安全、可拷贝、自带大小// 访问元素
arr[0] = 10;          // 下标访问(无边界检查)
int val = arr.at(1);  // 安全访问(越界抛异常)// 遍历
for (int num : arr) { // 范围for循环(推荐)std::cout << num;
}// 常用操作
bool empty = arr.empty(); // 是否为空(固定数组总为false)
int size = arr.size();    // 元素数量(3)

2. 动态大小数组 → std::vector

#include <vector>
std::vector<int> vec = {1, 2, 3}; // 动态扩容、内存自动管理// 添加元素
vec.push_back(4);        // 尾部追加(拷贝)
vec.emplace_back(5);     // 尾部追加(直接构造,更高效)// 删除元素
vec.pop_back();          // 删除尾部元素
vec.erase(vec.begin());  // 删除指定位置元素// 预分配内存(减少扩容开销)
vec.reserve(100);        // 预留容量(不改变size)// 遍历(同std::array)
for (int num : vec) {std::cout << num;
}

3. 传统 C 风格数组(不推荐,仅了解)

int arr[3] = {1, 2, 3}; // 栈上分配,大小固定
int* arr_heap = new int[3]{4, 5, 6}; // 堆上分配(需手动delete[])// 访问元素
arr[0] = 10; // 无越界检查(易崩溃)// 遍历
for (int i = 0; i < 3; ++i) {std::cout << arr[i];
}// 缺点:无法直接获取大小、易内存泄漏、不支持拷贝等

4. 关键对比与推荐

特性std::arraystd::vectorC 风格数组
大小固定否(动态扩容)
内存管理自动自动手动(堆分配)
越界检查.at() 方法支持.at() 方法支持
传递参数可拷贝、引用传递可拷贝、引用传递退化为指针
适用场景固定数量元素动态增删元素特殊需求

多用vector,固定数组大小的需求用array。

指针语法

考虑到指针是C类语言特点,可能别的语言没接触过看这个文章:

最通俗的指针类比解释-CSDN博客

一、基础声明与初始化

1.指针声明
推荐写法:数据类型* 指针名*紧贴类型,增强可读性)

int* pInt;         // 推荐:强调int*是一个类型
double* pDouble;   // 明确指向double的指针

2.初始化规范

int* p = new int(10);  // 动态初始化(需配对delete)
  • 必须初始化:int val = 5; int* p = &val;
  • 未指向对象时置空:int* p = nullptr

二、核心操作

1.取地址(&)与解引用(*)

int num = 42;
int* p = &num;     // &取地址
cout << *p;        // *解引用 → 输出42
*p = 100;          // 通过指针修改原值

2.动态内存管理(优先用智能指针)

  • 手动管理(需严格配对)

    int* arr = new int[5]{1,2,3}; // 动态数组
    delete[] arr;  // []必须与new[]配对
    
  • 智能指针(推荐)

    #include <memory>
    std::unique_ptr<int> uPtr = std::make_unique<int>(10);  // 独占所有权
    std::shared_ptr<int> sPtr = std::make_shared<int>(20); // 共享所有权
    

三、常用场景规范

数组操作

  • 数组名即首地址:int arr[3] = {1,2,3}; int* p = arr;
  • 传递数组到函数:
    void printArray(int* arr, int size) {  // 必须传大小for(int i=0; i<size; ++i) cout << arr[i];  // 等价*(arr+i)
    }
    

函数参数传递

  • 修改原对象时使用指针参数:

    void swap(int* a, int* b) {int tmp = *a;*a = *b;*b = tmp;
    }
    

四、安全实践

const修饰

const int* p1;     // 指向常量(值不可改)
int* const p2;     // 指针常量(地址不可改)
const int* const p3; // 双常量

避免常见错误

int* p = new int(5);
delete p;     // 正确释放
p = nullptr;  // 避免野指针
  • 禁止解引用空指针
  • 数组越界访问
  • 悬垂指针(释放后仍访问)

函数

函数定义:

写到主函数上面,或者声明函数。

要规定返回值。

 常规写法

#include <iostream>
#include <string>//写到上边void student(){std::string name = "张三";int age = 18;std::cout << "姓名:" << name << std::endl;
}int main()
{student();
}
#include <iostream>
#include <string>//写到下面,但是声明
void student();int main()
{student();
}void student() {std::string name = "张三";int age = 18;std::cout << "姓名:" << name << std::endl;
}
#include <iostream>
#include <string>//默认=李四及设置默认值
void student(std::string username="李四");int main()
{student("张三");student();
}void student(std::string username) {std::string name = username;int age = 18;std::cout << "姓名:" << name << std::endl;
}

传址传参

函数内对变量的操作会直接影响到函数外的相应变量。

#include <iostream>
#include <string>//默认=李四及设置默认值
void student(std::string &username);int main()
{std::string name = "张三";student(name);std::cout << name << std::endl;
}void student(std::string &username) {username = "李四";
}

函数重载

相同函数名,不同返回值,不同参数类型,根据传参执行对应函数。

#include <iostream>
#include <string>//默认=李四及设置默认值
void student(std::string& username);
void student(int& name);int main()
{std::string name = "张三";student(name);std::cout << name << std::endl;int age = 1;student(age);std::cout << age << std::endl;
}void student(std::string &username) {username = "李四";
}void student(int &name) {name = 789;
}

数学计算

大体看一遍!都带好了目录,要用的时候直接点到对应位置查阅!!

使用需要导入cmath库

#include <cmath>

1. 基础计算

double a = std::abs(-3.5);  // 绝对值 → 3.5(兼容整型/浮点)
double b = std::fmod(7.5, 3); // 浮点取余 → 1.5(处理循环进度)

2. 幂与根

double p = std::pow(2, 3);  // 2的3次方 → 8(如计算缩放比例)
double s = std::sqrt(16);   // 平方根 → 4(如物理引擎计算距离)
double c = std::cbrt(27);   // 立方根 → 3(3D空间计算)

3. 取整处理

double up = std::ceil(3.2);   // 向上取整 → 4(如分页计算)
double down = std::floor(3.8); // 向下取整 → 3(网格对齐)
double rd = std::round(3.5);   // 四舍五入 → 4(UI显示)
double cut = std::trunc(3.8);  // 截断小数 → 3(取整数部分)

4. 浮点数检查

bool nan = std::isnan(0.0/0.0); // 是否为非数字(NaN检查)
bool inf = std::isinf(1e300);  // 是否为无穷大(溢出处理)
bool valid = std::isfinite(3.14); // 是否为有效数(安全校验)

5. 极值与运算

double max_v = std::fmax(3, 5);  // 最大值 → 5(限制范围)
double min_v = std::fmin(3, 5);  // 最小值 → 3(约束边界)
double dist = std::hypot(3, 4);  // 直角斜边 → 5(2D/3D距离计算)

6. 特殊值生成

double nan_val = NAN;        // 表示非数字(需C++11)
double inf_val = INFINITY;   // 正无穷大(如超阈值标记)

面向对象

基础创建与公有私有

创建类分为公共和私有,公共能在类外使用,私有仅能在类内使用。

#include <iostream>
#include <string>class MyClass
{
public:std::string name="张三";int age = 18;private:std::string address = "北京";int phone = 123456789;};int main()
{MyClass i;std::cout << i.name << std::endl;std::cout << i.age << std::endl;//std::cout << i.address << std::endl;
}

std::cout << i.address << std::endl;

使用了私有的属性,无法调用。

 方法定义

#include <iostream>
#include <string>class MyClass
{
public:std::string name="张三";int age = 18;void print(){std::cout << "姓名:" << name << std::endl;std::cout << "年龄:" << age << std::endl;}private:std::string address = "北京";int phone = 123456789;};int main()
{MyClass i;i.print();
}

外部实现

内部定义函数,外部实现函数。

#include <iostream>
#include <string>class MyClass
{
public:std::string name="张三";int age = 18;void print();private:std::string address = "北京";int phone = 123456789;};void MyClass::print()
{std::cout << "姓名:" << name << std::endl;std::cout << "年龄:" << age << std::endl;
}int main()
{MyClass i;i.print();
}

构造函数

与类名相同的方法,当我们创建对象的时候就会执行方法。

实现的时候不要写返回值类型。

#include <iostream>
#include <string>class MyClass
{
public:std::string name;int age;MyClass(std::string name,int age);void printInfos();
private:std::string address = "北京";int phone = 123456789;
};MyClass::MyClass(std::string name, int age)
{this->name = name;this->age = age;
}void MyClass::printInfos()
{std::cout << "姓名:" << name << std::endl;std::cout << "年龄:" << age << std::endl;
}int main()
{MyClass i("张三",18);i.printInfos();
}

类继承

可以多继承

#include <iostream>
#include <string>class Animal
{
public:int age = 10;
private:};class Animal2
{
public:int age2 = 11;
private:};class Dog : public Animal, public Animal2
{
public:std::string name = "dog";
};void main()
{Dog dog;std::cout << dog.age << std::endl;std::cout << dog.name << std::endl;std::cout << dog.age2 << std::endl;
}

类多态

子类可以修改父类方法

#include <iostream>
#include <string>class Animal
{
public:void print(){std::cout << "i am Animal" << std::endl;}
private:};class Cat : public Animal
{
public:void print(){std::cout << "i am Cat" << std::endl;}
private:};class Dog : public Animal
{
public:void print(){std::cout << "i am Dog" << std::endl;}
};void main()
{Dog dog;Cat cat;dog.print();cat.print();
}

文件操作

文件的创建与写入。

1. 核心文件流类

  • #include <fstream>
  • ofstream: 写入文件(输出文件流)
  • ifstream: 读取文件(输入文件流)
  • fstream: 读写文件(需指定模式)

2. 基本文件操作

打开/关闭文件
// 写入文件
ofstream outFile("data.txt");      // 默认覆盖模式
outFile.close();// 读取文件
ifstream inFile("data.txt");
inFile.close();// 指定打开模式(如追加)
ofstream logFile("log.txt", ios::app);
常用打开模式
模式标志说明
ios::in读模式(默认ifstream)
ios::out写模式(默认ofstream)
ios::app追加写入(不覆盖原内容)
ios::binary二进制模式

3. 文本文件操作

写入文本
ofstream out("data.txt");
if (out.is_open()) {out << "Line 1" << endl;       // 写入并换行out << "Value: " << 42 << "\n";// 混合数据类型
}
读取文本
ifstream in("data.txt");
string line;
int value;if (in) {while (getline(in, line)) {     // 逐行读取cout << line << endl;}in.seekg(0);                   // 重置文件指针到开头in >> value;                    // 读取单个值(空格分隔)
}

4. 二进制文件操作

写入二进制数据
struct Person {char name[20];int age;
};Person p = {"Alice", 30};ofstream out("data.bin", ios::binary);
if (out) {out.write((char*)&p, sizeof(Person));  // 直接写入内存数据
}
读取二进制数据
ifstream in("data.bin", ios::binary);
Person p;if (in) {in.read((char*)&p, sizeof(Person));    // 读取到内存cout << p.name << " " << p.age << endl;
}

5. 文件指针控制

fstream file("data.txt");// 获取当前读指针位置
streampos pos = file.tellg();// 移动读指针到第10字节
file.seekg(10, ios::beg);// 移动写指针到文件末尾
file.seekp(0, ios::end);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/898840.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述

在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…

Unity Shader 的编程流程和结构

Unity Shader 的编程流程和结构 Unity Shader 的编程主要由以下三个核心部分组成&#xff1a;Properties&#xff08;属性&#xff09;、SubShader&#xff08;子着色器&#xff09; 和 Fallback&#xff08;回退&#xff09;。下面是它们的具体作用和结构&#xff1a; 1. Pr…

第十四天- 排序

一、排序的基本概念 排序是计算机科学中一项重要的操作&#xff0c;它将一组数据元素按照特定的顺序&#xff08;如升序或降序&#xff09;重新排列。排序算法的性能通常通过时间复杂度和空间复杂度来衡量。在 Python 中&#xff0c;有内置的排序函数&#xff0c;同时也可以手…

移除idea External Liraries 中maven依赖包

问题背景 扩展包里面不停的出现已经在POM文件注释的包&#xff0c;其实是没有查询到根源位置。 在IDEA插件中搜索Maven Helper 点击pom.xml文件 会出现扩展插件 定位之后在pom中添加exclusions&#xff0c;如下代码 <dependency><groupId>com.disney.eva.framewo…

AI革命!蓝耘携手海螺AI视频,打造智能化视频新纪元

AI革命&#xff01;蓝耘携手海螺AI视频&#xff0c;打造智能化视频新纪元 前言 在这个信息爆炸的时代&#xff0c;视频已经成为我们获取信息、学习新知识的重要方式。而随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;AI与视频内容的结合为我们带来了全新的…

dify1.1.1安装

1、 按照GitHub上操作 下载源码&#xff0c;没有安装git的&#xff0c;可以下载成zip包&#xff0c; unzip 解压 git clone https://github.com/langgenius/dify.git cd dify cd docker cp .env.example .env2、启动前 &#xff0c;先改下 docker-compose.yaml&#xff0c;…

ElasticSearch 可观测性最佳实践

ElasticSearch 概述 ElasticSearch 是一个开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据&#xff1b;本身扩展性很好&#xff0c;可以扩展到上百台服务器&#xff0c;处理 PB 级别&#xff08;大数据时代&#xff09;的数据。ES 也使用 Java 开…

Excel处理控件Spire.XLS系列教程:C# 在 Excel 中添加或删除单元格边框

单元格边框是指在单元格或单元格区域周围添加的线条。它们可用于不同的目的&#xff0c;如分隔工作表中的部分、吸引读者注意重要的单元格或使工作表看起来更美观。本文将介绍如何使用 Spire.XLS for .NET 在 C# 中添加或删除 Excel 单元格边框。 安装 Spire.XLS for .NET E-…

前端Wind CSS面试题及参考答案

目录 标准盒模型与 IE 盒模型的区别是什么?如何通过 box-sizing 属性切换这两种盒模型? 如何计算一个元素在标准盒模型下的总宽度(包含 margin、padding、border)? 父元素高度塌陷的原因是什么?请列举至少 3 种清除浮动的方法。 方法一:使用 clear 属性 方法二:使用…

基于 ECharts 实现动态图表渲染支持10万+数据点实时更新方案

引言 实现支持10万数据点实时更新的动态图表渲染确实具有挑战性&#xff0c;尤其是在性能和用户体验方面。以下是一些关键点和应用场景&#xff1a; 关键挑战 性能优化&#xff1a; 渲染性能&#xff1a;大量数据点会导致浏览器渲染压力大&#xff0c;可能引发卡顿。数据处理…

装饰器模式 (Decorator Pattern)

装饰器模式 (Decorator Pattern) 是一种结构型设计模式,它动态地给一个对象添加一些额外的职责,就增加功能来说,装饰器模式相比生成子类更为灵活。 一、基础 1 意图 动态地给一个对象添加一些额外的职责。 就增加功能来说,装饰器模式相比生成子类更为灵活。 2 适用场景 当…

【Java】TCP网络编程:从可靠传输到Socket实战

活动发起人小虚竹 想对你说&#xff1a; 这是一个以写作博客为目的的创作活动&#xff0c;旨在鼓励大学生博主们挖掘自己的创作潜能&#xff0c;展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴&#xff0c;那么&#xff0c;快来参加吧&#xff01…

蓝桥杯C++基础算法-0-1背包

这段代码实现了一个经典的0-1 背包问题的动态规划解法。0-1 背包问题是指给定一组物品&#xff0c;每个物品有其体积和价值&#xff0c;要求在不超过背包容量的情况下&#xff0c;选择物品使得总价值最大。以下是代码的详细思路解析&#xff1a; 1. 问题背景 给定 n 个物品&am…

html5炫酷的科技感3D文字效果实现详解

炫酷的科技感3D文字效果实现详解 这里写目录标题 炫酷的科技感3D文字效果实现详解项目概述核心技术实现1. 3D文字效果2. 故障艺术效果&#xff08;Glitch Effect&#xff09;3. 动态网格背景4. 扫描线效果5. 粒子效果 性能优化考虑技术难点与解决方案项目总结扩展优化方向 项目…

车道保持中车道线识别

需要让小车保持车道行驶&#xff0c;首先需要进行车道线识别。 也可参看论文&#xff08;上传到资源里&#xff09;&#xff1a;自动驾驶汽车车道检测与预测的技术解析-基于图像处理和Hough变换的方法 1 车道识别流程 想进行车道线识别&#xff0c;并且希望在图像中选择一个特…

英伟达有哪些支持AI绘画的 工程

英伟达在AI绘画领域布局广泛&#xff0c;其自研工具与第三方合作项目共同构建了完整的技术生态。以下是其核心支持AI绘画的工程及合作项目的详细介绍&#xff1a; 一、英伟达自研AI绘画工具 1. GauGAN系列 技术特点&#xff1a;基于生成对抗网络&#xff08;GAN&#xff09;&…

驱动开发的引入

1.引入 Linux内核的整体架构本就非常庞大&#xff0c;其包含的组件也非常多。而我们怎样把需要的部分都包含在内核中呢? 一种方法是把所有需要的功能都编译到Linux内核中。这会导致两个问题&#xff0c;一是生成的内核会很大&#xff0c;二是如果我们要在现有的内核中新增或删…

AI日报 - 2025年3月24日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Lyra生物序列建模架构效率惊人 在100生物任务中达最优&#xff0c;推理速度提升高达12万倍 ▎&#x1f4bc; 商业动向 | OpenAI用户破4亿&#xff0c;Meta与Reliance探讨AI合作 生态扩展与全…

VMware上对CentOS7虚拟机进行磁盘扩容、缩容

在VMware 17 Pro上对CentOS 7虚拟机进行磁盘扩容&#xff0c;同时保证原先部署的软件正常使用&#xff0c;可以按照以下步骤进行操作&#xff1a; 一、扩容 步骤一&#xff1a;关闭虚拟机并在VMware中扩展磁盘容量 关闭虚拟机&#xff1a;在VMware Workstation 17 Pro中&…

.gitignore使用指南

.gitignore使用指南 目录 什么是.gitignore为什么需要.gitignore如何创建.gitignore文件.gitignore文件的语法规则 忽略单个文件忽略目录忽略特定类型的文件不忽略特定文件或目录递归匹配 示例.gitignore文件注意事项更多特殊场景匹配规则 忽略多个特定后缀的文件忽略特定目录…