C++第一篇 入门基础

目录

1.C++的第一个程序

2.c++历代版本

3.命名空间

3.1 namespace关键字

namespace的用法:

namespace中定义函数

namespace中定义结构体

C++中的域:

3.2就近原则

4.命名空间的使用

5.C++输入输出

6.缺省参数

全缺省:

 半缺省:必须从右往左连续缺省(也就是给一个参数设定缺省值后,该参数后面的都必须有缺省值)

 7.函数重载

(1).参数类型不同

(2).参数个数不同

(3).参数顺序不同:

(4).疑惑点:

当缺省函数和无参函数重载时:

返回值不同不构成重载

8.引用

8.1引用的特点:

(1).引用在定义时必须初始化

(2).一个变量可以有多个引用

(3).引用一旦引用一个实体,再不能引用其他实体

8.2const引用 

8.2.1权限放大问题

8.2.2权限缩小问题

8.2.3对常量的引用

8.2.4隐式类型转换的引用

9.指针和引用的关系


1.C++的第一个程序

C++兼容C语言大多数的语法,所以C语言实现的helloworld依然可以运行,C++中需要把定义文件代码的后缀改为.cpp,visualstudio编译器看到是.cpp就会调用C++编译器编译,linux下要用g++编译,不再是gcc(c语言编译器)。

#include<iostream>
using namespace std;int main()
{cout << "hello world" << endl;//<< :流输出运算符return 0;
}

2.c++历代版本

C++98   C++11  C++20 为主流大版本

3.命名空间

3.1 namespace关键字

namespace的用法:

        定义一个命名空间,需要namespace关键字,后面跟上命名空间的名字,然后再跟一对{}即可, {}中为命名空间的成员。命名空间中可以定义 变量,函数,类型等。

        C语言中有命名冲突,当我们在写一个c语言程序时,比如我们定义了一个int rand=10;这个变量,如果我们没有包含#include<stdlib.h>这个头文件时,可以通过编译,但是我们包含了这个头文件,就会报错rand重定义,这是因为#include<stdlib.h>中还有一个rand()函数,所以会报错重定义。

为解决命名冲突,就要用到namespace命名空间。C++标准库的命名空间为std

例如:

要使用域作用限定符(::),左边写上命名空间的名字,右边写命名空间成员。

namespace 实质是定义出了一个域,这个域和全局的域各自独立,不同的域可以定义同名变量,所以rand就不会再冲突了。

namespace中定义函数

#include<iostream>
#include<stdlib.h>
using namespace std;
namespace mike
{int rand = 100;int gcd(int a, int b){return b == 0 ? a : gcd(b, a % b);}}
int main()
{int a = 10;int b = 20;cout <<mike:: gcd(a, b) << endl;return 0;
}

namespace中定义结构体

#include<iostream>
#include<stdlib.h>
using namespace std;
namespace mike
{int rand = 100;struct test{int a = 666;};}
int main()
{struct mike::test p1;return 0;
}

C++中的域:

C++域中有函数局部域,全局域,命名空间域,类域。

3.2就近原则

当全局中和局部中有同名变量时,优先输出局部变量,因为编译器查找是从局部到全局

#include<iostream>
#include<stdlib.h>
using namespace std;int a = 10;
int main()
{int a = 100;cout << a << endl;//输出结果为100return 0;
}

但是如何此时如何访问全局的a呢?

要使用 域作用限定符(::)

域作用限定符左边什么都不写,默认是全局域。

#include<iostream>
#include<stdlib.h>
using namespace std;int a = 10;
int main()
{int a = 100;cout << ::a << endl;//输出结果为10return 0;
}

4.命名空间的使用

(1).指定命名空间访问,项目中推荐这种用法。

(2).using将命名空间中某个成员展开,项目中经常访问的且不存在冲突的成员推荐这种方式。

(3).展开命名空间中全部成员,在项目中不推荐,冲突风险大,只有在日常练习中才使用。

#include<iostream>
#include<stdlib.h>
namespace mike
{int rand = 100;int ou = 1000;
}
using mike::rand;//展开指定成员,方法(2)
using namespace mike;//展开命名空间中全部成员 方法(3)int main()
{return 0;
}

5.C++输入输出

(1)<iostream>是Input Output Stream的缩写,是标准的输出输出流库。

(2).std::cin是istream类的对象,std::out是ostream类的对象。

(3).std::endl是一个函数,流输出时,相当于插入了一个换行字符。

(4).<<是流插入运算符,>>是流提取运算符。

(5).C++的输入输出可以自动识别变量类型(本质是通过函数重载实现的)。

6.缺省参数

(1).缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实参
则采用该形参的缺省值,否则使用指定的实参
,缺省参数分为全缺省和半缺省参数。

(2).全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。

(3).带缺省参数的函数调用,C++规定必须从左到右依次给实参,不能跳跃给实参。

(4).函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。

例如:

#include<iostream>
#include<stdlib.h>
using namespace std;void test(int a = 0)
{cout << a << endl;
}
int main()
{test();test(666);return 0;
}

输出结果:

全缺省:

#include<iostream>
#include<stdlib.h>
using namespace std;void test1(int a = 100, int b = 200, int c = 300)//全缺省
{cout << "A "<<a << ' ' <<"B " <<b << ' ' <<"C "<< c << endl;
}int main()
{test1();test1(1);test1(1,2);//必须从左向右依次给参数return 0;
}

 半缺省:
必须从右往左连续缺省(也就是给一个参数设定缺省值后,该参数后面的都必须有缺省值)

#include<iostream>
#include<stdlib.h>
using namespace std;
void test1(int a , int b = 200, int c=300)//半缺省,必须从右往左连续缺省
{cout << "A " << a << ' ' << "B " << b << ' ' << "C " << c << endl;
}int main()
{test1();return 0;
}

 7.函数重载

        C++支持在同一作用域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者类型不同。这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域中出现同名函数的。

(1).参数类型不同

#include<iostream>
#include<stdlib.h>
using namespace std;
//参数类型不同
void test(int a, int b)
{cout << "test(int a, int b)" << endl;
}
void test(double a, double b)
{cout << "test(double a, double b)" << endl;
}
void test(int a, double b)
{cout << "test(int a, double b)" << endl;
}
int main()
{test(1, 1);test(2.2, 2.2);test(1, 2.2);return 0;
}

运行结果:

(2).参数个数不同

#include<iostream>
#include<stdlib.h>
using namespace std;
//参数个数不同
void test()
{cout << "test()" << endl;
}
void test(int a)
{cout << "test(int a)" << endl;
}int main()
{test();test(1);return 0;
}

运行结果:

(3).参数顺序不同:

#include<iostream>
#include<stdlib.h>
using namespace std;
//参数顺序不同
void test(int a,char c)
{cout << "test(int a,char c)" << endl;
}
void test(char c, int a)
{cout << "test(char c, int a)" << endl;
}
int main()
{test(1,'c');test('c',1);return 0;
}

运行结果:

(4).疑惑点:

当缺省函数和无参函数重载时:

#include<iostream>
#include<stdlib.h>
using namespace std;//这两个函数也构成重载,但是调用test()时会报错,存在调用歧义,不知道应该调用那个
void test()
{cout << "test()" << endl;
}
void test(int a = 1)
{cout << "test(int a = 1)" << endl;
}int main()
{test();return 0;
}

报错:

返回值不同不构成重载

#include<iostream>
#include<stdlib.h>
using namespace std;void test()
{cout << "void test()" << endl;
}
int test()
{cout << "int test()" << endl;return 0;
}int main()
{return 0;
}

报错:

8.引用

引用不是新定义一个变量,而是给已存在变量取了一个别名编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

语法:类型& 引用别名 = 引用对象;

例1:

#include<iostream>
#include<stdlib.h>
using namespace std;int main()
{int a = 0;int& b = a;int& d = b;++d;cout <<"A="<< a <<" B="<< b << " D="<<d << endl;return 0; 
}

运行结果:

例2:

#include<iostream>
#include<stdlib.h>
using namespace std;void swap(int& a, int& b)
{int c = a;a = b;b = c;
}
int main()
{int a = 666;int b = 0;cout << "A=" << a << ' ' << "B=" << b << endl;swap(a, b);cout << "A=" << a << ' ' << "B=" << b << endl;return 0;
}

运行结果:

8.1引用的特点:


(1).引用在定义时必须初始化

(2).一个变量可以有多个引用

(3).引用一旦引用一个实体,再不能引用其他实体

(1).引用在定义时必须初始化

int main()
{int a = 10;int& b;return 0;
}

报错:

(2).一个变量可以有多个引用

int main()
{int a = 10;int& b = a;int& c = b;return 0;
}

(3).引用一旦引用一个实体,再不能引用其他实体

int main()
{int a = 10, b = 20;int& c = a;c = b;//只是把b的值赋值给c,不是将c指向breturn 0;
}

8.2const引用 

8.2.1权限放大问题


int main()
{const int a = 10;//a只可读不可写int& b = a;//b这个别名即可写又可读,所以会报错,这个问题叫做权限放大return 0;
}

报错:

 

正确:

int main()
{const int a = 10;//a只可读不可写const int& b = a;//b这个别名即可写又可读,所以会报错,这个问题叫做权限放大return 0;
}

8.2.2权限缩小问题

int main()
{int a = 10;//a即可读又可写const int& b = a;//b这个别名只允许读,不允许写,这样叫权限缩小,权限缩小没有任何问题return 0;
}

综上所述,权限可以缩小,但不可以放大

8.2.3对常量的引用

对常量引用只有const引用才可以。同时因为表达式为临时常量,临时常量具有常性,也必须使用const引用。

int main()
{int& a = 10;return 0;
}

报错:

const引用:

int main()
{const int& a = 10;int b = 10, c = 20;const int& d = (b + c);return 0;
}

8.2.4隐式类型转换的引用

int main()
{double a = 3.14;int& b = a;return 0;
}

报错:

必须使用const引用

因为在隐式类型转换时会产生临时对象,临时对象具有常性,必须使用const引用。

int main()
{double a = 3.14;const int& b = a;return 0;
}

9.指针和引用的关系

(1).上引用是一个变量的取别名不开空间,指针是存储一个变量地址,要开空间。

(2).引用在定义时必须初始化,指针建议初始化,但是语法上不是必须的。

(3).引用在初始化时引用一个对象后,就不能再引用其他对象;而指针可以在不断地改变指向对象。

(4).引用可以直接访问指向对象,指针需要解引用才是访问指向对象。

(5).sizeof中含义不同,引用结果为引用类型的大小,但指针始终是地址空间所占字节个数。

(6).指针很容易出现空指针和野指针的问题,引用很少出现,引用使用起来相对更安全


本篇完

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

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

相关文章

爆“卷”的AI视频,大厂向左,创企向右

文&#xff5c;白 鸽 编&#xff5c;王一粟 “生成的人物一转身就变成老外&#xff0c;怎么解决呢&#xff1f;” “没有办法&#xff0c;10s中动作大的&#xff0c;人物一致性有问题&#xff0c;只能抽卡&#xff0c;多刷几个&#xff0c;选择一个变化不大的。” 在一个以…

RocketMQ Server Windows安装

RocketMQ阿里开发 开源给apache 官网:RocketMQ 官方网站 | RocketMQ 下载后解压 配置环境变量 注意启动顺序 双击 注意 4.9.0这个版本必须 jdk 8 高了用不了 namesrv是注册中心的作用 broke是核心用于接收生产者消息 存储消息 发送给消费者消息 类似DubboZookeeper…

Java红娘相亲交友平台系统源码小程序

&#x1f495;遇见真爱&#xff0c;从“红娘相亲交友平台系统”开始&#xff01;&#x1f46b; &#x1f339;【精准匹配&#xff0c;缘分不再擦肩而过】 还在为茫茫人海中找不到那个TA而烦恼吗&#xff1f;“红娘相亲交友平台系统”利用先进的大数据分析技术&#xff0c;根据…

匿名内部类

一个类的内部又完整的嵌套了另一个类结构&#xff0c;被嵌套的类称为内部类&#xff0c;嵌套其他的类称为外部类。 类的五大成员&#xff1a;属性、方法、构造器、代码块、内部类 内部类最大的特点的就是直接访问私有属性&#xff0c;并且可以体现类鱼类之间的包含关系。 基本…

北斗三号海上人员落水报警及示位搜救系统升级方案

随着海洋经济的快速发展&#xff0c;海上作业活动日益频繁&#xff0c;人员安全问题也日益凸显。传统的海上救援手段存在诸多不足&#xff0c;如救援响应时间长、定位不准确等。为了提高海上救援的效率和成功率&#xff0c;北斗三号海上人员落水报警及示位搜救系统应运而生。该…

微波传感器 - 从零开始认识各种传感器【第二十期】

微波传感器|从零开始认识各种传感器 1、什么是微波传感器 微波传感器是一种利用微波技术进行探测和测量的传感器。 一般来说&#xff0c;微波是波长为1到1000毫米的电磁波。使用微波传感器&#xff0c;在不接触目标物体的情况下&#xff0c;通过检测和分析微波信号的反射、散…

Matplotlib柱形图大揭秘:让数据‘站’起来,比增高鞋垫还管用!

1. Matplotlib绘制柱形图/柱状图/条形图 柱状图是一种用矩形柱来表示数据分类的图表&#xff0c;柱状图可以垂直绘制&#xff0c;也可以水平绘制&#xff0c;它的高度与其表示的数据成正比关系 # 导包 import numpy as np import pandas as pd import matplotlib.pyplot as p…

机械学习—零基础学习日志(高数16——函数极限性质)

零基础为了学人工智能&#xff0c;真的开始复习高数 这里我们继续学习函数极限的性质。 局部有界性 充分条件与必要条件 极限存在是函数局部有界的充分条件。什么是充分条件&#xff0c;什么是必要条件呢&#xff1f;我这里做了一点小思考&#xff0c;和大家分享&#xff0c…

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端

Windows11下 Visual Studio 2022 + Qt6 的 WebSocket 线程池异步 客户端 1 开发 WebSocket 客户端1.1 开发环境1.1.1 为Qt 6安装 websockets1.2 .基于Qt6的 QWebSocket 客户端示例1.2.1 实现 WebSocket 客户端1.2.2 创建 QtQWesocketClient1.2.3 创建QWebsocket对象1.2.3.1 添加…

iOS object-C 解答算法:找到所有数组中消失的数字(leetCode-448)

找到所有数组中消失的数字(leetCode-448) 题目如下图:(也可以到leetCode上看完整题目,题号448) 光看题看可能有点难以理解,我们结合示例1来理解一下这道题. 有8个整数的数组 nums [4,3,2,7,8,2,3,1], 求在闭区间[1,8]范围内(即1,2,3,4,5,6,7,8)的数字,哪几个没有出现在数组 …

新装centos7虚拟机如何配置网络,NAT配置固定IP

首先声明&#xff0c;我想使用的是NAT连接模式&#xff0c;并且设置完IP之后&#xff0c;使得这个IP固定住&#xff0c;以后不会再变了。 文章目录 1&#xff0c;打开Vmware软件的【编辑】-【虚拟网络编辑器】2&#xff0c;先选择VMnet8&#xff08;画1处&#xff09;&#xf…

解析capl文件生成XML Test Module对应的xml工具

之前一直用的CAPL Test Module来写代码&#xff0c;所有的控制都是在MainTest()函数来实现的&#xff0c;但是有一次&#xff0c;代码都写完了&#xff0c;突然需要用xml的这种方式来实现&#xff0c;很突然&#xff0c;之前也没研究过&#xff0c;整理这个xml整的一身汗&#…

Hive3:库操作常用语句

1、创建库 create database if not exists myhive;2、选择库 use myhive;3、查看当前选择的库 SELECT current_database();4、查看库详细信息 desc database myhive;可以查看数据文件在hdfs集群中的存储位置 5、创建库时制定hdfs的存储位置 create database myhive2 …

安全防护软件的必要性:从微软蓝屏事件谈起

最近微软遭遇了的大规模蓝屏事件&#xff0c;让全球很多用户措手不及。这次事件告诉我们&#xff0c;保护我们的电脑和数据&#xff0c;安全防护软件是多么重要。 微软蓝屏事件源于网络安全公司CrowdStrike的技术更新错误&#xff0c;导致全球范围内大量Windows用户系统崩溃&a…

什么是五力分析?5分钟带你了解它在企业财务经营中的应用与价值!

如今&#xff0c;随着全球化进程的不断加速&#xff0c;市场环境复杂多变&#xff0c;市场竞争日益激烈&#xff0c;财务经营已经成为了企业应对复杂市场环境、保持自身竞争力的关键。体系化的五力分析平台能够为企业提供一套全面的解决方案&#xff0c;帮助企业在盈利能力、偿…

HamonyOS性能优化工具和方法

性能优化&#xff0c;如何做到更快的启动、更流畅的使用&#xff0c;概括图如下 ArkTS高性能编程&#xff1a; 1. ArkTS规则&#xff1a;有利于方舟编译运行时进行编译优化 2. 使用AOT(Ahead Of Time)模式对应用进行编译优化&#xff1a;方舟编译运行时通过采用PGO(Profile-Gui…

React 学习——组件内通信(兄弟之间)

A组件 > B组件 核心思路&#xff1a; 1、A组件先通过子传父的方式把数据传给父组件App 2、App拿到数据后通过父传子的方式再传递给B组件 import { useState } from "react" function A({onGetMsg}){const AMsg 我是A组件的消息return (<div><button…

ESP-ADF适配到自定义开发板中

ESP-ADF适配到自定义开发板中 前言:项目开发完了,来记录一下开发过程。 安装: 这里采用vscode+ESP-IDF+ESP-ADF的开发方式。 安装esp-idf的方法很简单,网上都是,这里不说了。想用esp-adf那么你idf的环境肯定是已经搭建好了。 安装adf也很简单,一步完成。 按下F1,选…

鸿蒙对接极光推送时候报错1000900010,厂商token获取失败

在AppGallery Connect上配置项目的调试证书&#xff0c;然后手动导入&#xff0c;不要用IDE的自动构建证书&#xff1a; https://developer.huawei.com/consumer/cn/service/josp/agc/index.html#/

web前端开发一、VScode环境搭建

1、VScode安装live server插件&#xff0c;写完代码后&#xff0c;保存就会在浏览器自动更新&#xff0c;不需要再去浏览器点击刷新了 2、创建html文件 3、在文件中输入感叹号 &#xff01; 4、选择第一个&#xff0c;然后回车&#xff0c;就会自动输入html的标准程序 5、…