初入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. 临时对象非常量引用报错

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

相关推荐
zzzsde1 小时前
【Linux】线程同步和互斥(1):线程互斥与加锁实现
linux·运维·服务器·开发语言·算法
yoyo_zzm1 小时前
编程语言大比拼:C++到PHP全解析
开发语言·c++·php
努力努力再努力wz1 小时前
【C++高阶数据结构系列】:时间轮定时器详解:原理分析与代码实现,带你从零手撕时间轮!(附时间轮的实现源码)
c语言·开发语言·数据结构·c++·qt·算法·ui
水饺编程2 小时前
编程基础:令牌粘贴指令,【##】
c语言·c++·windows·visual studio
Chen_harmony2 小时前
十九、数据在内存中的存储
c语言·开发语言
basketball6162 小时前
C 的 malloc/free 与 C++ 的 new/delete 一些区别
c语言·开发语言·c++
mmz12072 小时前
广搜题目练习(c++)
c++·算法
iiiiyu2 小时前
⾯向对象和集合编程题
java·大数据·开发语言·数据结构·编程语言
郝学胜-神的一滴2 小时前
Qt 高级开发 006: 架构全解 + 高效学习指南
开发语言·c++·qt·程序人生·架构