C++基础篇(一)-- 简单入门

news2024/12/27 12:17:42

        C++ 语言是在优化 C 语言的基础上为支持面向对象的程序设计而研制的一个通用目的的程序设计语言。在后来的持续研究中,C++ 增加了许多新概念,例如虚函数、重载、继承、标准模板库、异常处理、命名空间等。

        C++ 语言的特点主要表现在两个方面:全面兼容 C 语言 和 支持面向对象的方法。

1 基础知识

1.1 扩展名

        C语言源文件的后缀非常统一,在不同的编译器下都是.c。C++ 源文件的后缀则有些混乱,不同的编译器支持不同的后缀,下表是一个简单的汇总:

编译器Microsoft Visual C++GCC(GNU C++)Borland C++UNIX
后缀cpp、cxx、cccpp、cxx、cc、c++、CcppC、cc、cxx

        通常使用 .cpp 作为 C++ 源文件的后缀,这样更加通用和规范。

1.2 注释符

  • 单行注释://注释内容
int x;   // 定义 x 的数据类型为 int
  • 块注释:/* 注释内容 */
if(x>y)return x;
else return y;
/* 如果 x 大于 y 则返回 x
否则返回 y */

        注释符可以放置在代码的任何位置,且不参与代码运行。

1.3 头文件声明

        最简单的C++程序往往是下面这样声明头文件:

//C++中常用写法
#include < iostream >      //引用C++标准头文件库
using namespace std;      //使用名字空间

        #include 为C/C++中包含头文件命令,用于将指定头文件嵌入源文件中。#include一般用在 C、C++ 等语系的编译环境(编程软件的编程代码)中,也即告诉你,在这个地方要插入一堆代码,而这堆代码在另一个文件里。

        iostream是 C++ 的一个头文件库,在安装 C++ 环境的时候就已安装于电脑中,只需要用 include 将该它包含进来,就可以使用它的代码。

        C++已把标准C++库的组件放在一个名位 std 的 namespace 里面中,如果include头文件的时候加上.h,默认有using namespace,否则需要自己加上 using namespace std

        因此若没有第二行语句,cout 就会没有定义,除非使用 cout 时写成 std::cout,即指明其来自空间std 。

        按照 C 语言规则声明则是下面这样:

#include < iostream. h >    //引用头文件,不需要声明名字空间

        不加.h的是现在 C++ 中规定的标准,目的在于使C++代码用于移植和混合嵌入时不受扩展名 .h 的限制,避免因为.h而造成的额外的处理和修改。而加.h是c语言的用法,但是在c++中也支持这种用法,主要是为了向下兼容c 的内容,平时尽量不用这种方法 。

        在C++程序中,头文件不再以“.h”结尾,一些在C语言中常用的头文件在C++中的名字变为去掉“.h”,并在开头增加字符 c 。例如:

#include < cstdio >   //标准化后经过改造的C标准库,所有的组件都放在了std中
#include < cstring >  //C++标准库下,基于char* 的字符处理函数库
#include < string >   //增加了C++类的字符处理函数库
#include < cstdlib >  
#include < bits/stdc++.h>  //号称万能库,在大部分情况下使用这一行就可以省去其他库的生声明

        <stdio.h>是以往 C 和 C++ 的头文件,是标准C++(STL)函数库中的头文件,且 cstdio 中的函数都定义在一个名称空间 std 里面,如果要调用这个名字空间的函数,须加std::或者在文件中声明 using namespace std

        <string.h> 是标准C提供的字符处理函数集。面向char *.。 是C++为兼容C提供的 <string.h> 的C++版本,里面的主要改进有:将一些隐藏变量编入命名空间;修正一些C++编译器认为Bug的代码。

        <stdlib.h>可以提供一些函数与符号常量,是C++为兼容C提供的版本。

1.4 命名空间

        命名空间里面包含了逻辑结构上相互关联的一组类、函数、模板等。命名空间像是一个容器,把某些在逻辑结构上相关的 “对象” 放在一起并与外界区分。特别的,命名空间里的变量名或类名可以和命名空间外的变量名或类名重名。

        使用命名空间的时候,我们可以用 花括号 把声明块括起来,再以关键字 namespace 开头并命名,其基本格式如下:

namespace 命名空间的名字
{
    声明块
}
``

其中声明块中可以包含变量、类、函数等。例如:
```cpp
namespace S
{
    int x;
    void FunA()
    {
        ...
    }
}

        在命名空间外使用命名空间内的成员:命名空间的名字加上作用域运算符 ::

        参考上例 namespace S,若访问 x,可写成 S::x;访问 FunA() 则为 S::FunA()

        命名空间的嵌套, 具有分层屏蔽的作用。例如:

namespace S1
{
    namespace S2
    {
        int x;
        void FunA()
        {
        ...
        }
    }
}

        若要访问 x,则可写为 S1::S2::x,同理,访问 FunA() 则可写为 S1::S2::FunA()

        using 声明:若命名空间内的某个成员使用了 using 声明,那么这个成员在程序的后续使用中,可直接使用成员名,无需添加限定修饰名。使用 using 声明:以关键字 using 开头后跟命名空间内的成员名。参考上例嵌套的命名空间:

        namespace S2 中 int x 的 using 声明为:using S1::S2::x;

        注意: using namespace 后不能加类名或变量名。同上,若 namespace S2 中 int x 的 using 声明写为 using namespace S1::S2::x 便是错误的。

        using 指示符可以一次性地使命名空间内的全体成员被直接使用。using 指示符的使用: 以关键字 using namespace 开头后跟命名空间名字。特别的,std 命名空间声明和定义了标准 C++ 库中的所有组件,使用 using namespace std; 则可使用标准 C++ 库中的所有成员。

1.5 输入与输出

        C++ 标准 I/O 库包含 iostream、fstream 和 sstringstream。iostream、fstream 比较常用,一般操作于输入和输出,相较于前两者来说 sstringstream 的出现频率就低了许多,一般操作于数据的格式化。为了能更好的理解 C++ 语言的标准 I/O 库,我们参考 cplusplus 官网 的相关内容,整理注释了一份关于输入输出流类继承体系的关系图:

1. 标准输出流对象 cout
        预定义的插入符 “ << ” 作用在流类对象 cout 上可实现最基本的屏幕输出,其格式为:

cout << 表达式1 << 表达式2...;

        在输出语句中,若串联多个插入符,则可输出多个数据项。例如:

cout << a << b << c;

        则依次输出 a,b,c 三个数据项的值。

        若插入符后面是复杂的表达式,则系统自动计算其表达式的值并传给插入符。例如:

cout << "a+b=" << a+b;

        依次输出字符串 “ a+b= ” 以及 a+b 的计算结果。

2. 标准输入流对象 cin

        预定义的提取符 “ >> ” 作用在流类对象 cin 上可实现对键盘输入的提取操作,其格式为:

cin >> 表达式1 >> 表达式2...

        其中表达式通常用于存放输入值的变量。例如:

int a,b;
cin >> a >> b;

        即编译执行后,输入 a 和 b 的值,a 和 b 之间使用空格分隔。如输入:1 2,则给 a 赋值为 1,b 赋值为 2。

3. 简单的 I/O 格式控制
        一般情况下,使用 cin 和 cout 进行数据的输入和输出时,会自动按照默认的格式进行处理。如若需要设定特殊的格式,可利用 C++ I/O 流类库提供的操纵符进行调整。这些操纵符可直接嵌入到输入输出语句中实现格式控制。常用的 I/O 流类库操纵符,请阅读:C++ 基本的输入输出

1.6 编译和运行C++程序

        C/C++ 代码生成可执行文件的过程:

        我们常见的编译器有两个:

  • gcc 编译器
  • g++ 编译器
            gcc和g++都是GNU(组织)的编译器。

        程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示:

$ gcc main.cpp -lstdc++ -o main

        新建一个helloworld.cpp文件,最简单的编译方式:

$ g++ helloworld.cpp

        由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。程序可以这样来运行:

$ ./a.out
Hello, world!

        通常我们使用 -o 选项指定可执行程序的文件名,以下实例生成一个 helloworld 的可执行文件:

$ g++ helloworld.cpp -o helloworld

        执行 helloworld:

$ ./helloworld
Hello, world!

        如果是多个 C++ 代码文件,如 runoob1.cpp、runoob2.cpp,编译命令如下:

$ g++ runoob1.cpp runoob2.cpp -o runoob

        生成一个 runoob 可执行文件。

        g++ 有些系统默认是使用 C++98,我们可以指定使用 C++11 来编译 main.cpp 文件:

g++ -g -Wall -std=c++11 main.cpp

        g++ 常用命令选项:请阅读:g++ 常用命令选项

gcc和g++编译器的区别
g++:会把.c和.cpp的文件都当作是C++的源程序进行编译。
gcc:会把.c的程序当作是C的源程序进行编译,.cpp 的程序当作是C++的源程序进行编译


参考

  • C++语言:https://www.lanqiao.cn/courses/2752/learning/?id=47676&compatibility=false
  • 从C到C++:http://c.biancheng.net/view/2191.html
  • C++基础:https://www.runoob.com/cplusplus/cpp-environment-setup.html
  • 头文件声明:https://blog.csdn.net/weixin_39737764/article/details/
  • gcc编译:https://blog.csdn.net/weixin_41010198/article/details/117523288

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

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

相关文章

CSS的背景版块知识

&#x1f60a;博主页面&#xff1a;鱿年年 &#x1f449;博主推荐专栏&#xff1a;《WEB前端》&#x1f448; ​&#x1f493;博主格言&#xff1a;追风赶月莫停留&#xff0c;平芜尽处是春山❤️ 目录 前言 一、背景颜色 二、背景图片 三、背景平铺 四、背景图片位置…

ATTCK v10版本战术介绍—持久化(二)

一、引言在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行战术、持久化战术&#xff08;一&#xff09;知识&#xff0c;本期我们为大家介绍ATT&CK 14项战术中持久化战术&#xff08;二&#xff09;涉及的6项子技术&#xff0c;后续会陆续介绍其他战术…

魔兽世界335 自动加入公会教程

最近遇到新人进游戏不能自动加入公会的问题&#xff0c;论坛找了好久也没有找到解决办法。自己摸索后发现是核心的问题&#xff0c;下面教程开始1.利用GM账号进游戏&#xff0c;分别创建LM、BL角色&#xff0c;利用GM命令创建公会举例 LM角色名字&#xff1a;暴风 BL角色名字&a…

开发手册——一、编程规约_4.OOP规约

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成 本&#xff0c;直接用类名来访…

聚观早报 |支付宝与阿里合作推出支付芯;多多视频DAU峰值破1.5亿

今日要闻&#xff1a;支付宝与阿里合作推出支付芯&#xff1b;保时捷中国召回Panamera系列汽车&#xff1b;「多多视频」DAU峰值破1.5亿&#xff1b;苏州立法禁止大数据“杀熟”&#xff1b;特斯拉投资者日首次开幕支付宝与阿里合作推出支付芯 3 月 2 日消息&#xff0c;支付宝…

taobao.item.sku.update( 更新SKU信息 )

&#xffe5;开放平台免费API必须用户授权 *更新一个sku的数据 *需要更新的sku通过属性properties进行匹配查找 *商品的数量和价格必须大于等于0 *sku记录会更新到指定的num_iid对应的商品中 *num_iid对应的商品必须属于当前的会话用户 公共参数 请求地址: HTTP地址 http://gw.…

【C++修炼之路】23.哈希封装unordered系列

每一个不曾起舞的日子都是对生命的辜负 哈希封装unordered系列前言一.封装的迭代器二.改良后的HashTable.h三.封装的UnorderedSet.h四.封装的UnorderedMap.h五.Test.cpp及测试结果前言 unordered_map、unordered_set与map、set的区别是unoedered系列无序&#xff0c;除此之外功…

MD(消息摘要)、MAC(消息认证码)、数字签名的区别

MD(消息摘要&#xff09;、MAC(消息认证码&#xff09;、数字签名的区别 1.MD(消息摘要&#xff09;-散列算法 摘要是哈希值&#xff0c;我们通过散列算法⽐如MD5算法就可以得到这个哈希值。摘要只是⽤于验证数据完整性和唯⼀性的哈希值&#xff0c;不管原始数据是什么样的&a…

【json代码diff效果展示】vue项目 手动实现高仿github的内容diff效果

文章目录1-1 vue-code-diff业务需求 &#xff1a; 思考&#xff1a; 对比两个json字符串&#xff0c;维护增删改的三个数组 遍历&#xff0c;进行三四五次if判断进入不同数组&#xff0c;渲染页面不对呀&#xff0c;数据展示&#xff0c;怎么根据json对应键展示字段呢&#xf…

Linux基础命令-gdisk使用GPT类型创建分区

文章目录 一 命令介绍 二 MBR和GPT的区别 MBR GPT 三 命令语法 四 基本参数 1 常用参数 2 操作菜单说明 五 参考实例 1 对磁盘设备进行分区 2 查看磁盘的所有分区表 命令总结 一 命令介绍 NAME gdisk - Interactive GUID partition table (GPT) manipulato…

VAE--part1

Variational Auto-Encoder, VAE__part1分布变换VAE慢谈VAE 初现分布标准化重参数技巧VAE的本质是什么&#xff1f;VAE的本质结构正态分布&#xff1f;变分在哪里参考博客仅做学习记录&#xff0c;侵删分布变换 VAE和GAN都是生成式模型&#xff0c;它们俩的目标基本一致&#x…

如何在 3dMax 中制作游戏中的战斧模型?

继续给大家分享3dMax教程&#xff1a;如何在3dsMax中制作战斧教程。 介绍 大家好&#xff01;今天想和大家分享的是用3ds Max制作一把战斧&#xff0c;分享一下制作过程中用到的一些技巧和技巧。这是一个比较基础的教程&#xff0c;包括建模、雕刻、pbr贴图。 概念 这把战斧…

如何利用站内推广和站外推广提高转化率?

在如今的网络时代&#xff0c;拥有一个好的网站是非常重要的。但是&#xff0c;光有一个好的网站是不够的&#xff0c;为了达到我们的目标&#xff0c;需要不断地提高网站的转化率。而在实现这个目标的过程中&#xff0c;站内推广和站外推广是两个非常关键的因素。 站内推广是…

【企业服务器LNMP环境搭建】mysql安装

MySQL安装步骤&#xff1a; 1、相关说明 1.1、编译参数的说明 -DCMAKE_INSTALL_PREFIX安装到的软件目录-DMYSQL_DATADIR数据文件存储的路径-DSYSCONFDIR配置文件路径 (my.cnf)-DENABLED_LOCAL_INFILE1使用localmysql客户端的配置-DWITH_PARTITION_STORAGE_ENGINE使mysql支持…

Web3中文|值得了解:Web3的成功离不开什么?

即使受到负面新闻和部门监管的打击&#xff0c;区块链仍然是Web3应用程序开发、生态发展和主流采用的关键。围绕区块链技术的潜在用例及应用有很多争论&#xff0c;而最近相关讨论似乎已经进入了白热化的阶段。随着监管机构打击质押服务、禁止稳定币交易&#xff0c;以及对NFT支…

Delphi 中 FireDAC 数据库连接(多线程)

参见&#xff1a;Delphi 中 FireDAC 数据库连接&#xff08;总览&#xff09;本主题描述了如何在多线程环境下使用FireDAC。一、概述如果满足以下条件&#xff0c;FireDAC是线程安全的。一个连接对象和所有与之相关的对象&#xff08;如TFDQuery、TFDTransaction等&#xff09;…

CSS实现动画效果的菜单收起展开图标,html实现动画效果的箭头

效果 实现代码 此处JS代码引入了jquery <!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title><style>.menu-icon{position: absolute;left: 20%;top: 30%;transition: all .3s;}.menu-icon:before, .menu…

Rollup L2 and L3

1. 引言 前序博客有&#xff1a; Rollup DecentralizationRollup去中心化Rollup交易的固化流程 Layer 1&#xff1a;数据可用层Layer 2&#xff1a;执行层Layer 3&#xff1a;链下系统 所有系统设计中&#xff0c;都包含了某种可信元素&#xff0c;用于保护系统safety和live…

滑动窗口最大值:单调队列

239. 滑动窗口最大值 难度困难2154收藏分享切换为英文接收动态反馈 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例…

人像磨皮美颜sdk是什么?磨皮技术详解

每当讨论起美颜sdk的功能&#xff0c;“磨皮”肯定首当其冲&#xff0c;从一开始&#xff0c;这个功能就受到了很多人的欢迎&#xff0c;尤其是当它与美白、美颜结合在一起的时候&#xff0c;更是发挥出了最大的作用&#xff0c;时至今日它的热度依然不减。使用者可以通过磨皮功…