C++基础精讲-01

news2025/5/17 14:36:28

1C++概述

1.1初识C++

发展历程
C++ 由本贾尼・斯特劳斯特卢普在 20 世纪 70 年代开发,它在 C 语言的基础上增加了面向对象编程的特性,最初被称为 “C with Classes”,后来逐渐发展成为独立的 C++ 语言。
语言特点
(1)高效性:C++ 允许直接操作计算机硬件,能够对内存进行精细的管理,具有很高的执行效率,适用于开发对性能要求极高的程序,如游戏、操作系统、嵌入式系统等。
(2)面向对象:支持面向对象编程,将数据和操作数据的方法封装在类中,通过继承和多态性实现代码的复用和扩展,使程序结构更加清晰、易于维护。
(3)兼容性:与 C 语言保持了高度的兼容性,使得 C++ 可以直接使用大量现有的 C 语言代码和库,同时还能享受到 C++ 面向对象和高级特性带来的便利。
(4)丰富的库:拥有标准模板库(STL)等丰富的库,提供了各种常用的数据结构(如向量、链表、映射等)和算法(如排序、搜索等),大大提高了开发效率。
应用领域
C++ 应用广泛,除了上述提到的游戏开发、操作系统和嵌入式系统外,还用于图形图像、数据库管理、网络编程、金融计算等领域。
C和C++的关系
C++ 是 C 语言的超集,它继承了 C 语言的优点,同时又进行了扩展和改进。
g++编译器的下载
g++编译器是用来编译C++的;

sudo apt update
sudo apt install g++

第一个C++程序

#include<iostream> // 包含输入输出流库,使得程序可以使用标准输入输出功能,如 cout 和 cin
using namespace std; // 使用标准命名空间,这样在使用标准库中的对象和函数时就不需要加 std:: 前缀

int main(int argc, char* argv[]) // 主函数,程序的入口点,argc 表示命令行参数的数量,argv 是一个指向命令行参数的字符指针数组
{
    cout << "hello world" << endl; // 输出字符串 "hello world" 到标准输出(通常是控制台),endl 表示换行

    return 0; // 主函数返回 0,表示程序正常结束
}

2.命名空间

2.1命名空间的概述

1.什么是实体?
变量、常量、函数、结构体、引用、类、对象、模板、命名空间等,它们都称为实体
2.什么是命名空间?
命名空间又称为名字空间,是程序员命名的内存区域,程序员根据需要指定一些有名字的空间域,把一些全局实体分别存放到各个命名空间中,从而与其他全局实体分隔开
比如c++中的输入输出cin和cout就在std标准命名空间中定义;
3.为什么要使用命名空间?
大型工程常由多人分工完成,不同人设计不同头文件,这可能导致不同头文件中类或函数命名相同,引发名字冲突。C++为解决该问题引入命名空间,它是用户自定义的作用域,在不同作用域可定义同名变量且互不干扰,系统能进行区分。
4.命名空间的基本格式

namespace 名

namespace A
{
        int a=10;
        ......

}

2.1命名空间基本使用

1.作用域限定符::

每次要使用某个命名空间中的实体时,都直接加上作用域限定符::

#include<iostream> // 引入输入输出流库,用于使用 cout 和 endl 进行输出操作

// 定义命名空间 A
namespace A {
    int a = 10; // 在命名空间 A 中定义一个整型变量 a 并初始化为 10
    void fun1(void) { // 在命名空间 A 中定义一个无返回值、无参数的函数 fun1
        std::cout << "a=" << a << std::endl; // 输出命名空间 A 中变量 a 的值,并换行
    }
}

// 定义一个无返回值、无参数的函数 test1
void test1(void) {
    A::fun1(); // 调用命名空间 A 中的 fun1 函数,输出 a 的初始值
    A::a = 100; // 修改命名空间 A 中变量 a 的值为 100
    A::fun1(); // 再次调用命名空间 A 中的 fun1 函数,输出修改后 a 的值
}

// 主函数,程序的入口点
int main(void) {
    test1(); // 调用 test1 函数

    return 0; // 主函数正常结束,返回 0
}                             

在这里插入图片描述

好处:准确,只要命名空间中确实有这个实体,就能够准确调用(访问)
坏处:繁琐

2.using编译指令

如第一个C++程序,其中std代表的是标准命名空间。cout和endl都是std中的实体,使用了using编译指令后,这两个实体就可以直接使用了。

#include<iostream>
using namespace std;

namespace A
{
        int a=100;
        void fun1(void)
        {
                cout<<"a="<<a<<endl;
        }
}       

using namespace A;

void test1(void)
{       
        fun1();
        a=200;
        fun1();
        
}       

int main(void)
{       
        test1();

        return 0;
}       
~                                                                                                     
~                              

在这里插入图片描述
建议1
using编译指令尽量写在局部作用域,这样using编译指令的效果也会在其作用域结束时结束;可以避免命名冲突
错误案例

#include<iostream>
using namespace std;

namespace A
{
        int a=100;

}       

namespace B
{
        int a=200;
}

using namespace A;
using namespace B;     //A和B命令空间里的变量a会产生冲突

void test1(void)
{       
        
        //这里的a不知道访问A还是B里的变量a;
        a=200;
        cout<<"a="<<a<<endl;
        
}       

int main(void)
{       
        test1();

        return 0;
}       

解决办法
1.使用作用域限定符
在这里插入图片描述
2.using编译指令尽量写在局部作用域,避免和其他变量名起冲突
在这里插入图片描述

3.using声明机制(推荐)

—— 需要什么就声明什么
建议将using声明语句写在局部作用域中。此时即使命名空间中实体与全局位置实体重名,在局部位置也遵循“就近原则”形成屏蔽

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

namespace A
{
        int a=10;
        int b=20;
}

int a=1000;

void test1(void)
{       
        using A::a;
        cout<<"a="<<a<<endl;
}

int main(int argc,char*argv[])
{       
        test1();
        cout<<"a="<<a<<endl;

        return 0;
}

在这里插入图片描述

4.命名空间的嵌套使用

命名空间中还可以定义命名空间

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

namespace A
{
        int a=10;
        int b=20;
        namespace B
        {
                int c=200;
        }
}



void test1(void)
{       
        using A::B::c;
        cout<<"c="<<c<<endl;
}

int main(int argc,char*argv[])
{       
        test1();

        return 0;
}

在这里插入图片描述

5.匿名命名空间

命名空间还可以不定义名字,不定义名字的命名空间称为匿名命名空间(简称匿名空间)。
通常,如果我们希望一部分实体只在本文件中起作用,那么可以将它们定义在匿名空间中。

namespace {
//...
}

使用匿名空间中实体时,可以直接使用,也可以加上作用域限定符(没有空间名)

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

namespace
{
        int a=100;
        int b=200;
        int c=300;
}



int main(int argc,char*argv[])
{
        cout<<"a="<<a<<endl;

        int b=2;
        cout<<"b="<<b<<endl;
        cout<<"b="<<::b<<endl;
        

        return 0;
}
~                                                                                                     
~                                      

在这里插入图片描述
匿名空间注意事项:
(1)匿名空间不要定义与全局空间中同名的实体;
(2)匿名空间中的实体不能跨模块调用。

6.命名空间补充

在同一个源文件中可以多次定义同名的命名空间,被认为是同一个命名空间,所以不能在其中定义相同的实体

#include<iostream>
using std::cout;
using std::cin;
using std::endl;

namespace A
{
        int a=100;
        
}

namespace A
{
        int c=200;
}

void test(void)
{
        using A::a;
        using A::c;
        cout<<"a="<<a<<endl;
        cout<<"c="<<c<<endl;
}

int main(int argc,char*argv[])
{
        test();
        
        return 0;
}

在这里插入图片描述

3.const关键字

3.1修饰内置类型

const修饰的变量称为const常量,之后不能修改其值。(本质还是变量,使用时也是当成变量使用,只是被赋予只读属性)
const常量在定义时必须初始化。

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

void test1(void)
{       
         //只有读权限,没有写权限
        const int number1 = 10;
        int const number2 = 20;

        cout<<number1<<endl;
        cout<<number2<<endl;

}

int main(void)
{       
        test1();
        
        return 0;
}       

在这里插入图片描述
宏定义的方式创建常量

#define MAX 100

3.2修饰指针类型*

1. 指向常量的指针
指向常量的指针意味着不能通过该指针来修改所指向对象的值,不过指针本身可以指向其他对象。

const 数据类型 * 指针名;
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main(void) {
    int num = 10;
    const int *ptr = &num;
    // *ptr = 20;  // 错误,不能通过指向常量的指针修改所指向的值
    num = 20;  // 可以直接修改 num 的值
    cout << *ptr << endl;  // 输出 20
    return 0;
}

2. 常量指针
常量指针表示指针本身的值(即所指向的地址)不能被修改,不过可以通过该指针修改所指向对象的值。

数据类型 * const 指针名;
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main(void) {
    int num1 = 10;
    int num2 = 20;
    int * const ptr = &num1;
    *ptr = 30;  // 可以通过常量指针修改所指向的值
    // ptr = &num2;  // 错误,不能修改常量指针的值
    cout << *ptr << endl;  // 输出 30
    return 0;
}

3. 指向常量的常量指针
指向常量的常量指针既不能修改指针所指向对象的值,也不能修改指针本身的值。

const 数据类型 * const 指针名;
#include <iostream>
using std::cin;
using std::cout;
using std::endl;

int main(void) {
    int num1 = 10;
    int num2 = 20;
    const int * const ptr = &num1;
    // *ptr = 30;  // 错误,不能通过指向常量的常量指针修改所指向的值
    // ptr = &num2;  // 错误,不能修改指向常量的常量指针的值
    cout << *ptr << endl;  // 输出 10
    return 0;
}

总结
指向常量的指针:不能通过指针修改所指向对象的值,但指针可以指向其他对象。
常量指针:指针本身的值不能修改,但可以通过指针修改所指向对象的值。
指向常量的常量指针:既不能修改指针所指向对象的值,也不能修改指针本身的值。

3.3const 常量和宏定义常量区别

发生时机:
宏定义在 C 语言预处理阶段,单纯进行字符串替换。比如 #define PI 3.14 ,预处理时会把代码中所有 PI 都替换成 3.14 。
const 常量在编译时起作用,它本质近似变量,只是被 const 限定为只读。像 const double pi = 3.14; ,编译时会处理这个定义。
类型和安全检查:
宏定义没有类型概念,不做类型检查。如 #define ADD(a, b) ((a)+(b)) ,传入不同类型参数都直接替换展开,可能引发错误。
const 常量有明确类型,编译期会执行类型检查。如 const int num = 5; ,类型不匹配的赋值等操作编译时会报错 。
通常推荐用 const 常量替代宏定义常量,能利用编译期类型检查机制,减少因宏定义的简单替换带来的错误风险。

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

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

相关文章

为什么Java不支持多继承?如何实现多继承?

一、前言 Java不支持多继承&#xff08;一个类继承多个父类&#xff09;主要出于文中设计考虑&#xff1b;核心目的是简化语言复杂性并避免潜在的歧义性问题。 二、直接原因&#xff1a;菱形继承/钻石继承问题&#xff08;Diamond Problem&#xff09; 假设存在如下继承关系&…

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 &#x1f4cc; 为什么日志在项目中如此重要&#xff1f; 在开发和维护一个后端系统时&#xff0c;日志就像程序运行时的“黑匣子”&#xff0c;帮我们记录系统的各种行为和异常。一份良好的日志&#xff0c;不仅能帮助我们快速定位问题&#xff0c;还能在以下场景中…

Express中间件(Middleware)详解:从零开始掌握(1)

1. 中间件是什么&#xff1f; 想象中间件就像一个"加工流水线"&#xff0c;请求(Request)从进入服务器到返回响应(Response)的过程中&#xff0c;会经过一个个"工作站"进行处理。 简单定义&#xff1a;中间件是能够访问请求对象(req)、响应对象(res)和下…

现代工业测试的核心支柱:电机试验工作台?(北重机械厂家)

电机试验工作台是现代工业测试中的核心支柱之一。这种工作台通常用于对各种类型的电机进行性能测试、负载测试和耐久性测试。通过电机试验工作台&#xff0c;工程师可以评估电机的效率、功率输出、转速、扭矩、温度等关键参数&#xff0c;从而确保电机的设计符合要求&#xff0…

oracle 11g密码长度和复杂度查看与设置

verify_function_11G 的密码复杂性要求: 密码长度至少为 8 个字符。 密码必须包含至少一个数字和一个字母字符。 密码不能与用户名相同或相似。 密码不能是服务器名或其变体。 密码不能是常见的弱密码&#xff08;如 welcome1、oracle123 等&#xff09;。 注意事项&…

CVE-2025-32375 | Windows下复现 BentoML runner 服务器远程命令执行漏洞

目录 1. 漏洞描述2. 漏洞复现1. 安装 BentoML 1.4.72. 创建模型3. 构建模型4. 托管模型5. 执行exp 3. POC4. 补充学习 参考链接&#xff1a; https://mp.weixin.qq.com/s/IxLZr83RvYqfZ_eXhtNvgg https://github.com/bentoml/BentoML/security/advisories/GHSA-7v4r-c989-xh26 …

某局jsvmp算法分析(dunshan.js/lzkqow23819/lzkqow39189)

帮朋友看一个税某局的加密算法。 传送门 &#xff08;需要帐号登陆的 普通人没授权也看不了&#xff09; 废话不多说直接抓包开干 这里可以看到一个headers中的加密参数 lzkqow23819 以及url路径里面的6eMrZlPH(这个有点像瑞数里面的&#xff09; 还有就是cookies里面的这几个…

AlmaLinux9.5 修改为静态IP地址

查看当前需要修改的网卡名称 ip a进入网卡目录 cd /etc/NetworkManager/system-connections找到对应网卡配置文件进行修改 修改配置 主要修改ipv4部分&#xff0c;改成自己的IP配置 [ipv4] methodmanual address1192.168.252.129/24,192.168.252.254 dns8.8.8.8重启网卡 …

操作系统 4.4-从生磁盘到文件

文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块&#xff08;block&#xff09;和文件&#xff08;file&#xff09;之间&#xff0c;使得用户可以以更直观和易于理解的方式与磁盘交互&#xff0c;而无需直接处理磁盘的物理细节如扇区&#xff08;se…

免费多语言文档翻译软件推荐

软件介绍 今天给大家介绍一款文档翻译助手。它能够支持PDF、Word等多种文档格式&#xff0c;涵盖中文、英文、日语等多语言互译。此软件在翻译过程中精选保留文档原貌&#xff0c;每段文字、每个图表的匹配都十分完美&#xff0c;还依托顶尖翻译大模型&#xff0c;让翻译结果符…

安全序列(DP)

#include <bits/stdc.h> using namespace std; const int MOD1e97; const int N1e65; int f[N]; int main() {int n,k;cin>>n>>k;f[0]1;for(int i1;i<n;i){f[i]f[i-1]; // 不放桶&#xff1a;延续前一位的所有方案if(i-k-1>0){f[i](f[i]f[i-k…

【Flask开发】嘿马文学web完整flask项目第4篇:4.分类,4.分类【附代码文档】

教程总体简介&#xff1a;2. 目标 1.1产品与开发 1.2环境配置 1.3 运行方式 1.4目录说明 1.5数据库设计 2.用户认证 Json Web Token(JWT) 3.书架 4.1分类列表 5.搜索 5.3搜索-精准&高匹配&推荐 6.小说 6.4推荐-同类热门推荐 7.浏览记录 8.1配置-阅读偏好 8.配置 9.1项目…

SQL开发的智能助手:通义灵码在IntelliJ IDEA中的应用

SQL 是一种至关重要的数据库操作语言&#xff0c;尽管其语法与通用编程语言有所不同&#xff0c;但因其在众多应用中的广泛使用&#xff0c;大多数程序员都具备一定的 SQL 编写能力。然而&#xff0c;当面对复杂的 SQL 语句或优化需求时&#xff0c;往往需要专业数据库开发工程…

解决:AttributeError: module ‘cv2‘ has no attribute ‘COLOR_BGR2RGB‘

opencv AttributeError: module ‘cv2’ has no attribute ‘warpFrame’ 或者 opencv 没有 rgbd 解决上述问题的方法是&#xff1a; 卸载重装。 但是一定要卸载干净&#xff0c;仅仅卸载opencv-python是不行的。无限重复都报这个错。 使用pip list | grep opencv查看相关的…

NutriJarvis:AI慧眼识餐,精准营养触手可及!—— 基于深度学习的菜品识别与营养计算系统

NutriJarvis&#xff1a;AI慧眼识餐&#xff0c;精准营养触手可及&#xff01;—— 基于深度学习的菜品识别与营养计算系统 NutriJarvis 是一个基于深度学习的菜品识别与营养计算系统&#xff0c;旨在通过计算机视觉技术自动识别餐盘中的食物&#xff0c;并估算其营养成分&…

【LaTeX】

基本使用 \documentclass 类型&#xff1a;文章&#xff08;article&#xff09;、报告&#xff08;report&#xff09;、书&#xff08;book&#xff09; 中文的文章是ctexart&#xff0c;中文字体是UTF8 \documentclass[UTF8]{ctexart} []说明可以省略不写的意思&#xf…

细说STM32单片机FreeRTOS任务管理相关函数及多任务编程的实现方法

目录 一、FreeRTOS任务管理相关函数 1、FreeRTOS函数 2、FreeRTOS宏函数 3、主要函数功能说明 &#xff08;1&#xff09;创建任务osThreadNew() &#xff08;2&#xff09;删除任务vTaskDelete() &#xff08;3&#xff09;挂起任务vTaskSuspend() &#xff08;4&…

uniapp微信小程序基于wu-input二次封装TInput组件(支持点击下拉选择、支持整数、电话、小数、身份证、小数点位数控制功能)

一、 最终效果 二、实现了功能 1、支持输入正整数---设置specifyTypeinteger 2、支持输入数字&#xff08;含小数点&#xff09;---设置specifyTypedecimal&#xff0c;可设置decimalLimit来调整小数点位数 3、支持输入手机号--设置specifyTypephone 4、支持输入身份证号---设…

leetcode-419.棋盘上的战舰

leetcode-419.棋盘上的战舰 文章目录 leetcode-419.棋盘上的战舰一.题目描述二.第一次代码提交三.第二次代码提交 一.题目描述 二.第一次代码提交 class Solution { public:int countBattleships(vector<vector<char>>& board) {int m board.size(); //列数i…

使用uglifyjs对静态引入的js文件进行压缩

前言 因为有时候js文件没有npm包&#xff0c;或者需要修改&#xff0c;只能引入静态的js&#xff0c;那么这个时候就可以对js进行压缩了。我其实想通过vite、webpack等插件进行压缩的&#xff0c;可是他都不能定位到public目录下面的文件&#xff0c;所以我只能自己压缩了。编…