初入C++

个人主页流年如梦

专栏《零基础轻松入门C语言》 《数据结构:从入门到掌握》 《C++编程研习录》

文章目录

前言

C++ 是在 C 语言基础上发展而来的高性能编程语言,兼具过程化与面向对象特性,是后端、游戏、嵌入式、基础架构开发的核心语言

一.C++的第一个程序

C++完全兼容C语言,但它拥有更现代化的语法

1.1C语言写法(在C++支持)

cpp 复制代码
#include <stdio.h>

int main()
{
    printf("hello world\n");
    return 0;
}

1.2C++写法

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    cout << "hello world" << endl;
    return 0;
}

其中:

  1. #include<iostream> --> 输入输出流头文件,C++输入输出的必须头文件
  2. using namespace std; --> 使用标准命名空间,std是C++标准库的空间
  3. cout --> 标准输出对象,相当于屏幕
  4. << --> 流插入运算符,表示把数据流向屏幕
  5. endl --> 换行并刷新缓冲区
  6. 特点:自动识别类型,不需要%d%f%s

二.命名空间namespace

2.1为什么需要命名空间

C语言最大的问题 --> 全局变量、函数容易冲突

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>

int rand = 10; // 编译报错!rand 和库函数冲突

int main()
{
    printf("%d\n", rand);
    return 0;
}

命名空间 = 给名字加一层 "隔离罩",避免冲突

2.2定义命名空间

cpp 复制代码
namespace 空间名
{
    //可以定义:变量、函数、结构体、类型
};

举例:

cpp 复制代码
namespace bit
{
    int rand = 10;

    int Add(int a, int b)
    {
        return a + b;
    }

    struct Node
    {
        int val;
        struct Node* next;
    };
}

2.3命名空间三种使用方式

2.3.1指定空间访问

最规范、项目推荐

cpp 复制代码
printf("%d\n", bit::rand);

2.3.2展开某个成员

cpp 复制代码
using bit::rand;
printf("%d\n", rand);

2.3.3展开整个空间

cpp 复制代码
using namespace bit;
printf("%d\n", rand);

2.4命名空间嵌套

cpp 复制代码
namespace bit
{
    namespace xlx
    {
        int a = 1;
    }

    namespace lg
    {
        int a = 2;
    }
}

cout << bit::xlx::a << endl;
cout << bit::lg::a << endl;

2.5多文件同名命名空间会合并

多个文件写同一个namespace时,编译器会自动合并成一个

三.C++的输入(cout)与输出(cin)

3.1标准输出cout

cpp 复制代码
cout << 变量 << 常量 << endl;

3.2标准输入cin

cpp 复制代码
cin >> 变量;

3.3自动识别类型

cpp 复制代码
#include <iostream>
using namespace std;

int main()
{
    int a;
    double b;
    char c;

    cin >> a >> b >> c;
    cout << a << " " << b << " " << c << endl;

    return 0;
}

3.4C++ IO加速

大量输入输出时,C++ 默认较慢,加这三行提速(竞赛必备)

cpp 复制代码
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);

四.缺省参数

4.1概念

声明函数时,给参数一个默认值,调用不传参就用默认值

4.2全缺省参数

cpp 复制代码
void Func(int a = 10, int b = 20, int c = 30)
{
    cout << a << " " << b << " " << c << endl;
}

调用:

cpp 复制代码
Func();      //全部默认
Func(1);     //a=1,其余默认
Func(1,2);   //a=1,b=2,c默认
Func(1,2,3); //全部传参

4.3半缺省参数

规则:必须从右往左连续缺省,不能跳着缺省

正确写法:

cpp 复制代码
void Func(int a, int b = 10, int c = 20)
{}

错误写法:

cpp 复制代码
void Func(int a = 10, int b, int c)
{}

4.4注意事项

声明与定义不能同时给缺省值 ,缺省值只能写在声明里,定义不能写

五.函数重载

5.1什么是函数重载

同一作用域下:函数名相同,参数不同(类型 / 个数 / 顺序),就构成重载

5.2三种构成重载

5.2.1参数类型不同

cpp 复制代码
int Add(int a, int b)
{}

double Add(double a, double b)
{}

5.2.2参数个数不同

cpp 复制代码
void f()
{}

void f(int a)
{}

5.2.3参数类型顺序不同

cpp 复制代码
void f(int a, char b)
{}

void f(char b, int a)
{}

5.3注意事项❗

返回值不同不能构成重载

错误示例:

cpp 复制代码
void f()
{}

int f()
{}

调用时编译器无法区分

六.引用 &(最常用、最重要语法)

6.1什么是引用

引用 = 变量的别名,不开新空间,共用同一块内存

引用语法

cpp 复制代码
类型& 别名 = 原变量;

举例

cpp 复制代码
int a = 10;
int& b = a;
int& c = a;

其中b、c 都是 a 的别名,修改任何一个,a 都会变

6.2引用三大特性

  1. 定义时必须初始化
  2. 一旦绑定,不能再改变指向
  3. 一个变量可以有多个引用

6.3引用做参数(简化指针,不用 * )

直接修改实参,比指针更简洁、更安全

cpp 复制代码
void Swap(int& rx, int& ry)
{
    int tmp = rx;
    rx = ry;
    ry = tmp;
}

int main()
{
    int x = 10, y = 20;
    Swap(x, y);
    return 0;
}

6.4引用做返回值

返回引用可以修改返回值 ,并且减少拷贝

cpp 复制代码
int& STTop(ST& st)
{
    return st.a[st.top - 1];
}

STTop(st) += 10;//可以直接修改栈顶

6.5const引用(权限问题)

引用时权限可以缩小,但不能放大

正确使用示例

cpp 复制代码
const int a = 10;
const int& ra = a;
cpp 复制代码
int b = 20;
const int& rb = b;

错误使用示例

cpp 复制代码
const int a = 10;
int& ra = a;

6.6临时对象具有常性

cpp 复制代码
int a = 10;
// int& rb = a * 3;// --> 错误
const int& rb = a * 3;// --> 正确

七.内联函数inline(替代宏函数)

7.1作用

频繁调用的短小函数 ,在调用处直接展开,不建立栈帧,提高效率

cpp 复制代码
inline int Add(int x, int y)
{
    return x + y;
}

7.2优点

  1. 没有宏的坑
  2. 有类型检查
  3. 方便调试(宏不可以调试)

7.3注意事项❗

  1. inline只是建议,函数太长、递归会被编译器忽略
  2. 声明和定义不要分离,否则会链接错误

八.nullptr(C++11空指针)

8.1NULL问题

C++中NULL就是0,会导致函数重载调用错误

cpp 复制代码
void f(int)
{}

void f(int*)
{}

int main()
{
    //f(NULL);//调用f(int) --> 这种写法错误的
    f(nullptr);//调用f(int*) --> 这是对的
}

注意❗:C++中空指针一律写nullptr

🎯总结

  1. 第一个程序#include <iostream> + using namespace std;
  2. 命名空间:解决名字冲突,三种使用方式
  3. cin / cout:自动识别类型,简洁安全
  4. 缺省参数:从右往左连续缺省,声明给默认值
  5. 函数重载:同名不同参,返回值不参与重载
  6. 引用:变量别名,简化传参,权限不可放大
  7. inline:短小函数展开,替代宏
  8. nullptr :C++11空指针,比NULL更安全

⚠️易错点

  1. 引用未初始化就使用
  2. 引用试图改变指向(语法不报错但逻辑错误)
  3. 缺省参数跳跃缺省、声明定义同时给值
  4. 以为返回值不同可以构成重载
  5. 项目滥用using namespace std
  6. 空指针使用NULL导致重载错误
  7. 临时对象非常量引用报错

👀 关注 我们一路同行,从入门到大师,慢慢沉淀、稳步成长
❤️ 点赞 鼓励原创,让优质内容被更多人看见
⭐ 收藏 收好核心知识点与实战技巧,需要时随时查阅
💬 评论 分享你的疑问或踩坑经历,一起交流避坑、共同进步

相关推荐
xieliyu.6 小时前
Java算法精讲:双指针(二)
java·开发语言·算法
苏宸啊7 小时前
IPC管道
linux·c++
何以解忧,唯有..7 小时前
Python包管理工具pip:从入门到精通
开发语言·python·pip
BestOrNothing_20157 小时前
ROS2 话题通信实战:消息对象、Publisher 发布器与 Subscriber 订阅器保姆级教程
c++·ros2·subscriber·publisher·话题通信
雪的季节7 小时前
RabbitMQ详解
开发语言
ice8130331818 小时前
【Python】Matplotlib折线图绘制
开发语言·python·matplotlib
三品吉他手会点灯8 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
kkeeper~8 小时前
0基础C语言积跬步之动态内存管理
c语言·开发语言
橘右今8 小时前
2026 Java后端高频面试宝典
java·开发语言·面试
艾iYYY8 小时前
string 类的模拟实现
android·服务器·c语言·c++·算法