C++开篇

ops/2024/10/18 15:58:21/

目录

1.C++的第一个程序

2.命名空间namespace

2.1命名空间的定义

2.2命名空间的使用

3.C++输入&输出

4.缺省参数

5.函数重载

6.引用(取别名)

 6.1引用的概念

 6.2引用的特性

 6.3引用的使用


1.C++的第一个程序

C++兼容C语言绝大多数的语法,所以C语⾔实现的hello world依旧可以运⾏,C++中需要把定义⽂件代码后缀改为.cpp

#include<stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
当然C++有⼀套⾃⼰的输⼊输出,严格说C++版本的hello world应该是这样写的。
#include<iostream>
using namespace std;
int main()
{
cout << "hello world\n" << endl;//cout:输出
return 0;
}

2.命名空间namespace

在C/C++中,变量、函数和类都是⼤量存在的,这些变量、函数和类的名称将都存在于全局作⽤域中,可能会导致 很多冲突 。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的.
如:
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
// 编译报错:error C2365: “rand”: 重定义;以前的定义是“函数”
printf("%d\n", rand);
return 0;
}

2.1命名空间的定义

定义命名空间,需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义 同名变量 ,所以下⾯的rand不在冲突了。
C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响编译查找逻辑,还会影响变量的声明周期,命名空间域和类域 不影响 变量声明周期。
namespace只能定义在全局,当然他还可以 嵌套定义
项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。
C++标准库都放在⼀个叫std(standard)的命名空间中。
#include<stdio.h>
#include<stdlib.h>
//1.正常的命名空间定义
//pzn是命名空间的名字
namespace pzn
{//命名空间中可以定义变量/函数/类型int rand = 10;int ADD(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}//2.命名空间可以嵌套
namespace pan
{namespace pg{int rand = 1;int ADD(int left, int right){return left + right;}}namespace hg{int rand = 2;int ADD(int left, int right){return left + right;}}
}int main()
{//这里默认是访问的是全局的rand函数指针printf("%d\n",rand);//这里指定pzn命名空间中的randprintf("%d\n", pzn::rand);return 0;
}
//多⽂件中可以定义同名namespace,他们会默认合并到⼀起,就像同⼀个namespace⼀样

2.2命名空间的使用

 

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以下⾯程序会编译报错。所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
  • 指定命名空间访问,项⽬中推荐这种⽅式。
  • using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
  • 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤
#include<stdio.h>
namespace pzn
{int a=0;int b=1;
}
int main
{//编程报错:error C2065:“a”:未声明的标识符printf("%d\n",a);return 0;
}
//using将命名空间中某个成员展开
using N::b;
int main()
{printf("%d\n",N::a);printf("%d\n",b);return 0;
}
// 展开命名空间中全部成员
using namespce N;
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}

3.C++输入&输出

 

  • iostream> 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输出对象。
  • std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输⼊流。
  • std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
  • std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
  • <<是流插⼊运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)
  • 使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊输出可以⾃动识别变量类型(本质是通过函数重载实现的),其实最重要的是
  • C++的流能更好的⽀持⾃定义类型对象的输⼊输出。
  • cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要通过命名空间的使⽤⽅式去⽤他们。
  • ⼀般⽇常练习中我们可以using namespace std,实际项⽬开发中不建议using namespace std。
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
int main()
{
int a = 0;
double b = 0.1;
char c = 'x';
cout << a << " " << b << " " << c << endl;
std::cout << a << " " << b << " " << c << std::endl;
scanf("%d%lf", &a, &b);
printf("%d %lf\n", a, b);
// 可以⾃动识别变量的类型
cin >> a;
cin >> b >> c;
cout << a << endl;
cout << b << " " << c << endl;
return 0;
}

4.缺省参数

  • 缺省参数是声明或定义函数时为函数的参数指定⼀个缺省值。在调⽤该函数时,如果没有指定实参
  • 则采⽤该形参的缺省值,否则使⽤指定的实参,缺省参数分为全缺省和半缺省参数。(有些地⽅把缺省参数也叫默认参数
  • 全缺省就是全部形参给缺省值,半缺省就是部分形参给缺省值。C++规定半缺省参数必须从右往左依次连续缺省,不能间隔跳跃给缺省值。
  • 带缺省参数的函数调⽤,C++规定必须从左到右依次给实参,不能跳跃给实参。
  • 函数声明和定义分离时,缺省参数不能在函数声明和定义中同时出现,规定必须函数声明给缺省值。
#include<iostream>
#include<assert.h>
using namespace std;
void Func(int a = 0)
{cout << a << endl;
}
int main()
{Func();//没有传参时,使用参数的默认值Func(10);//传参时,使用指定的实参return 0;
}
#include<iostream>
using namespace std;//全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}//半缺省
void Func2(int a, int b = 10, int c = 20)//从左往右依次给实参,不能跳跃给实参
{cout << "a = " << a << endl;cout << "b = " << b << endl;cout << "c = " << c << endl << endl;
}int main()
{Func1();Func1(1);Func1(1, 2);Func1(1, 2, 3);Func2(100);Func2(100, 200);Func2(100, 200, 300);return 0;
}

5.函数重载

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

 

#include<iostream>
using namespace std;
// 1、参数类型不同
int Add(int left, int right)
{
cout << "int Add(int left, int right)" << endl;
return left + right;
}
double Add(double left, double right)
{
cout << "double Add(double left, double right)" << endl;
return left + right;
}
// 2、参数个数不同
void f()
{
cout << "f()" << endl;
}
void f(int a)
{
cout << "f(int a)" << endl;
}
// 3、参数类型顺序不同
void f(int a, char b)
{
cout << "f(int a,char b)" << endl;
}
void f(char b, int a)
{
cout << "f(char b, int a)" << endl;
}

6.引用(取别名)

 6.1引用的概念

引⽤不是新定义⼀个变量,⽽是给已存在变量 取了⼀个别名 ,编译器不会为引⽤变量 开辟内存 空间,它和它引⽤的变量共⽤同⼀块内存空间。⽐如:⽔壶传中李逵,宋江叫"铁⽜",江湖上⼈称"⿊旋⻛";林冲,外号豹⼦头;
类型& 引⽤别名 = 引⽤对象;
C++中为了避免引⼊太多的运算符,会复⽤C语⾔的⼀些符号,⽐如前⾯的<< 和 >>,这⾥引⽤也和取 地址使⽤了同⼀个符号&
#include<iostream>
using namespace std;
int main()
{
int a = 0;
// 引⽤:b和c是a的别名
int& b = a;
int& c = a;
// 也可以给别名b取别名,d相当于还是a的别名
int& d = b;
++d;
// 这⾥取地址我们看到是⼀样的
cout << &a << endl;
cout << &b << endl;
cout << &c << endl;
cout << &d << endl;
return 0;
}

++d,就等于a、b、c、d全部都++;abcd全部都是同一个东西,只是有了不同的名字。

 6.2引用的特性

  • 引⽤在定义时必须初始化
  • ⼀个变量可以有多个引⽤
  • 引⽤⼀旦引⽤⼀个实体,再不能引⽤其他实体

 6.3引用的使用

  • 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变引⽤对象。
  • 引⽤传参跟指针传参功能是类似的,引⽤传参相对更⽅便⼀些。
  • 引⽤和指针在实践中相辅相成,功能有重叠性,但是各有特点,互相不可替代
//代替指针传参
void Swap(int& rx, int& ry)//改变引⽤对象时同时改变被引⽤对象
{
int tmp = rx;
rx = ry;
ry = tmp;
}
int main()
{
int x = 0, y = 1;
cout << x <<" " << y << endl;
Swap(x, y);
cout << x << " " << y << endl;
return 0;
}

感谢观看


http://www.ppmy.cn/ops/56604.html

相关文章

【机器学习】独立成分分析(ICA):解锁信号的隐秘面纱

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 独立成分分析&#xff08;ICA&#xff09;&#xff1a;解锁信号的隐秘面纱引言I…

从0到1开发一个Vue3的新手引导组件(附带遇到的问题以及解决方式)

1. 前言: 新手引导组件,顾名思义,就是强制性的要求第一次使用的用户跟随引导使用应用,可以让一些第一次使用系统的新手快速上手,正好我最近也遇到了这个需求,于是就想着开发一个通用组件拿出来使用(写完之后才发现element就有,后悔了哈哈哈&#x1f62d;&#x1f62d;) 示例图…

Redis数据同步

文章简单介绍基于redis-shake的redis数据同步&#xff0c;该工具基于每个节点同步数据&#xff0c;即每个主节点需同步一次&#xff0c;才能完成整个redis集群的数据同步。 1、redis节点操作 ### 查看redis版本 ./bin/redis-server --version### 登录redis ./bin/redis-cli -…

Android ViewPostImeInputStage输入事件处理

InputDispatcher向InputChannel使用socket写入输入事件&#xff0c;触发InputEventReceiver调用来接收输入事件。 ViewPostImeInputStage处理view控件的事件 frameworks/base/core/java/android/view/InputEventReceiver.java dispatchInputEvent frameworks/base/core/jav…

怎样优化 PostgreSQL 中对复杂查询的执行计划分析?

文章目录 怎样优化 PostgreSQL 中对复杂查询的执行计划分析 怎样优化 PostgreSQL 中对复杂查询的执行计划分析 在数据库管理的领域中&#xff0c;PostgreSQL 作为一款强大且广泛应用的关系型数据库&#xff0c;经常面临着处理复杂查询的挑战。对于复杂查询&#xff0c;执行计划…

基于CentOS Stream 9平台搭建MinIO以及开机自启

1. 官网 https://min.io/download?licenseagpl&platformlinux 1.1 下载二进制包 指定目录下载 cd /opt/coisini/ wget https://dl.min.io/server/minio/release/linux-amd64/minio1.2 文件赋权 chmod x /opt/coisini/minio1.3 创建Minio存储数据目录&#xff1a; mkdi…

子任务:IT运维的精细化管理之道

在当今的企业运营中&#xff0c;信息技术已成为支撑业务发展的核心力量。根据Gartner的报告&#xff0c;IT服务管理&#xff08;ITSM&#xff09;的有效实施可以显著提升企业的运营效率&#xff0c;降低成本高达15%&#xff0c;同时提高服务交付速度和质量。随着业务的复杂性和…

服务器为什么大多用 Linux?

这个事&#xff0c;IIS&#xff08;微软的 Web Server&#xff09;至少要负一大半责任。 首先&#xff0c;大家不要去按照现在Linux的情况跟Windows比。 很多东西在发展过程中就是一种生态强弱的比较。在那个关键的时间点&#xff0c;你的生态强&#xff0c;大家都用你&#x…