C++的入门基础

news2024/12/24 16:36:55

目录

  • C++的简单介绍
  • 命名空间
  • 命名空间的使用
  • C++的输入与输出
  • 缺省参数
  • 函数重载

C++的简单介绍

本贾尼·斯特劳斯特卢普博士在C的基础上增加了面向对象的特性,这时又增加了继承和、类、封装的概念,为后来的面向对象的编程奠定了基础,这被命名为C++

命名空间

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

namespace rzj
{
	//变量
	int a = 2;

	//函数
	int Add(int a, int b)
	{
		return a + b;
	}

	//结构体
	struct listnode
	{
		struct node* c;
		int val;
	}LN;
}

2.namespace 本质上是定义一个域,这个域和全局域各自独立,不同的域可以定义同名的变量。

:: 域作用限定符:下面的用例中有说明

#include<stdio.h>
#include<stdlib.h>

namespace rzj
{
	int rand = 2;
}

int a = 0;

int rand = 2;

int main()
{
	//这个会和stdlib.h下的rand函数产生冲突
	printf("%p\n",rand);
	//rand访问的是全局域中的stdlib.h下的函数指针
	//默认先访问局部的域再访问全局的域

	printf("%d\n",rzj::rand);//2
	// 命名空间的名字::命名空间中的成员名

	int a = 1;
	printf("%d\n", a);//1
	//全局域上和局部域上出现两个相同的变量,就近原则,先访问局部域

	//:: 域作用限定符
	printf("%d\n",::a);//0
	//:: 前面什么都没有,默认访问全局域

	return 0;
}

在这里插入图片描述

在这里插入图片描述

int main()
{
	printf("%d\n", rzj::Add(1, 1));
	//函数的命名空间的访问
	struct rzj::Node p1;
    //结构体的命名空间访问,访问的是名字,不是关键字
	return 0;
}

3.C++域中有全局域、局部域、命名空间域、类域,域影响的是编译是语法查找一个变量/函数/类型出处(声明或定义)的逻辑,有了域隔离,名字冲突就解决了。
局部域和全局域既影响编译时查找,又影响变量的生命周期,命名空间域和类域不影响变量的生命周期,只影响编译时查找。

4.namespace只能定义在全局,当然也可以嵌套定义。

namespace a
{
	namespace b
	{
		int rand = 1;
		int Add(int a, int b)
		{
			return a + b;
		}
	}

	namespace c
	{
		int rand = 2;
		int Add(int a, int b)
		{
			return a * b;
		}
	}
}

int main()
{
	printf("%d\n", a::b::rand);//1
	printf("%d\n", a::c::rand);//2

	return 0;
}

5.多文件中可以定义同名的namespace,他们默认合并在一起,就像同一个namespace一样,是逻辑上的合并,并不是真的合并。

stack.h
namespace rzj
{
   //...
   typedef struct Stack
	{
		STDataType* a;
		int top;
		int capacity;
	}ST;
}

stack.c 
namespace rzj
{
  //...
}

test.c
int main
{
  //调用rzj namespace的
	rzj::ST st2;
	//访问结构体的命名空间
	printf("%d\n", sizeof(st2));
	rzj::STInit(&st2, 4);
	rzj::STPush(&st2, 1);
	rzj::STPush(&st2, 2);
}

6. C++标准库放在一个命名空间std中

命名空间的使用

命名空间的使用有三种方式:

1.using namespace rzj; 把命名空间全部展开
全部展开在自己写的程序下可以用,但是在公司开发中用会产生冲突。

2.指定命名空间中的成员
经常使用这个成员就把它展开来
rzj::a;
每个成员都指定比较麻烦

3.展开命名空间中某个成员
using rzj::b;

公司开发过程中常用的是2 和 3

namespace rzj
{
	int a = 2;
	int b = 1;
}

using namespace rzj;
//展开命名空间
using rzj::b;
//展开命名空间中某个成员

int main()
{
    printf("%d\n",b);
    printf("%d\n",b);
    printf("%d\n",b);  
	printf("%d\n",rzj::a);
	//指定访问

	return 0;
}

C++的输入与输出

1.是标准的输入输出流的库,定义了标准的输入输出流的面向对象。

2.std::cin是istream类的对象,面对窄字符的标准输入

3.std::cout是ostream类的对象,面对窄字符的标准输出

4.<<是流插入运算符, 输出流>>是流提取运算符输入流(C语言中是左移和右移操作符)

5.std::endl(endl == end line)一个字符的结束或者换行
endl是一个函数,流插入输出时相当于1个换行

6.C++的输入输出时可以支持自定义类型,并且可以自动识别变量的类型

#include<iostream>

using namespace std;

int main()
{
	int a, b, c;

	cin >> a >> b >> c;
	//1 2 3
	cout << a << " " << b << " " << c << endl;
	//1 2 3

	return 0;
}

在这里插入图片描述

缺省参数

1.在调用函数时,如果没有传参时,使用参数的默认值,也就是缺省值,传了参数时,使用指定的实参

2.全缺省:在形参中,都给了缺省值
半缺省:在形参中,给了部分缺省值

3.C++规定半缺省给的值,必须从右往左连续缺省,不能间隔和跳跃给缺省值

4.有缺省函数的调用,传参时,实参必须从左往右给,不能间隔,跳跃

5.在声明和定义时,在声明中给缺省值,声明在.h文件中,在定义中不给缺省值,定义在.c文件中,为了防止冲突

缺省参数的意义:在开空间时提前给缺省值,可以防止空间的浪费,提前知道要1000个int大小的空间,就提前给实参1000,传给缺省参数

void Func(int a = 0)
{
	cout << a << endl;
}
int main()
{
	Func();
	// 没有传参时,使⽤参数的默认值
	Func(10);
	// 传参时,使⽤指定的实参
	return 0;
}

// 全缺省
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;
}

函数重载

C++允许在同一作用域中出现同名函数,但要求这些同名函数的形参不同,可以是参数个数不同或者类型不同
这是构成函数重载的条件。

函数的返回值不同不构成重载

// 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;
}
// 下⾯两个函数构成重载
// f()但是调⽤时,会报错,存在歧义,编译器不知道调⽤谁
//解决办法是把第一个f1封装到一个命名空间中去,第一个调用时是对命名空间的成员进行调用,第二个是在全局域中调用
//但是这种办法也违背了他们不是函数重载了,因为函数重载是在同一个作用域中才可以实现,所以这个是没有解决办法的

//无参
void f1()
{
cout << "f()" << endl;
}
//不传参时是无参,会存在歧义
void f1(int a = 10)
{
cout << "f(int a)" << endl;
}

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

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

相关文章

UDP通讯实现

服务器端&#xff1a; 1.获取套接字 int fd;fdsocket(AF_INET,SOCK_DGRAM,0);if(fd<0){perror("socket");exit(0);} #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&…

LabVIEW中自定义Ring控件的图标

在LabVIEW中&#xff0c;自定义Ring控件的图标可以让用户界面更加直观和友好。以下是如何在LabVIEW中自定义Ring控件的图标的详细步骤&#xff1a; 步骤1&#xff1a;创建或获取图标 首先&#xff0c;你需要创建或获取你想要在Ring控件中使用的图标。你可以使用图像编辑软件&…

前端面试题27(在实际项目中,如何有效地利用Vue3的响应式系统提高性能?)

在实际项目中&#xff0c;有效利用Vue3的响应式系统提高性能主要涉及以下几个关键点&#xff1a; 1. 合理使用reactive和ref reactive&#xff1a;用于将复杂的数据结构&#xff08;如对象或数组&#xff09;转换成响应式版本。确保只将需要实时更新的数据结构声明为响应式&am…

VsCode崩溃无法打开解决办法

今天打开电脑 点开vscode突然不能使用了 每次点开都闪退,于是查找解决办法 直接重启电脑 这个方法没有解决问题 删除软件 重新安装软件 软件删干净之前保存下自己的配置文件 比如扩展和settings.json和keybinding.json Mac系统 在 /Users/用户名/.vscode/extensions 和/User…

jmeter测试工具学习

1.双击jar包打开&#xff0c;发现那个bat打不开 2.新建plan之后编辑添加线程组 会加入500*5次请求 3.添加HTTP请求 添加字段 为了让http请求发送到不同的分片&#xff0c;要把userid随机化 4.添加监听器 5.聚合报告

【大模型搭建】部署Ollama,pull失败,手动构建方案

Ollama 是一个专注于简化大规模机器学习模型开发的框架。它提供了一系列工具来帮助开发者轻松地定义、训练和部署大型语言模型。 优点&#xff1a; • 提供了简洁的API&#xff0c;易于上手。 • 支持多种硬件加速选项&#xff0c;如GPU和TPU。 • 内置了许多预训练模型&#x…

MGRE复习综合实验

R1与R5之间使用ppp的pap认证&#xff0c;R5为主认证方&#xff1a; R1 interface Serial4/0/0ip address 15.0.0.1 8link-protocol pppppp pap local-user huawei password cipher 123456 R5 aaalocal-user huawei password cipher 123456local-user huawei service-type…

java中 使用数组实现需求小案例

Date: 2024.04.08 18:32:57 author: lijianzhan 需求实现&#xff1a; 设计一个java类&#xff0c;java方法&#xff0c;根据用户手动输入的绩点&#xff0c;从而获取到绩点最高的成绩。 实现业务逻辑的代码块 import java.util.Scanner;public class PointDemo {/*** 需求&…

中国计量大学理学院访问赛氪网:共探校企合作新篇章来

2024年7月5日&#xff0c;中国计量大学理学院代表团莅临环球赛乐&#xff08;北京&#xff09;科技有限公司&#xff0c;进行了一场深入的调研交流活动。代表团成员包括中国计量大学理学院副院长王义康教授、数据科学系副主任刘学艺副教授以及金世举老师。此次访问旨在进一步强…

wordpress外贸建站公司案例英文模板

Indirect Trade WP外贸网站模板 WordPress Indirect Trade外贸网站模板&#xff0c;建外贸独立站用wordpress模板&#xff0c;快速搭建十分便捷。 衣物清洁wordpress独立站模板 洗衣粉、洗衣液、衣物柔顺剂、干洗剂、衣领净、洗衣皂等衣物清洁wordpress独立站模板。 家具wordpr…

00 Debian字符界面如何支持中文

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian字符界面如何支持中文 《傅老师Debian知识库系列之00》——原创 前言 傅老师Debian知识库特点&#xff1a; 1、拆解Debian实用技能&#xff1b; 2、…

前端视角下的Spring-Boot语法学习:打印 hello-world

今日话题 基于 Spring Boot 打印输出 hello world 作者&#xff1a;云层上的光 时间&#xff1a;2024年6月20日 14时25分14秒 主线任务 一、打印 hello world 1、点击 “新建项目”用来演示 打印输出 “hello world” 2、填写项目配置&#xff1a;&#xff08;详细版见&a…

MYSQL 四、mysql进阶 7(性能分析工具的使用)

一、数据库服务器的优化步骤 数据库调优流程图: 整个流程划分成了 观察&#xff08;Show status&#xff09; 和 行动&#xff08;Action&#xff09; 两个部分。字母 S 的部分代表观察&#xff08;会使 用相应的分析工具&#xff09;&#xff0c;字母 A 代表的部分是行…

利用 Python 解析pcap文件

1、问题背景 当面对处理网络数据包分析时&#xff0c;pcap文件作为一个常见的文件格式存储了网络数据包的详细记录&#xff0c;它常常被用来进行网络故障排查或安全分析。为了充分利用这些数据&#xff0c;我们需要对其进行解析并提取出有价值的信息&#xff0c;例如数据包类型…

Git 查看、新建、删除、切换分支

Git 是一个版本控制系统&#xff0c;软件开发者用它来跟踪应用程序的变化并进行项目协作。 分支的诞生便于开发人员在彼此独立的环境中进行开发工作。主分支&#xff08;通常是 main 或 master&#xff09;可以保持稳定&#xff0c;而新的功能或修复可以在单独的分支中进行开发…

Angular进阶之九: JS code coverage是如何运作的

环境准备 需要用到的包 node 18.16.0# Javascript 代码编辑"babel/core": "^7.24.7","babel/preset-env": "^7.24.7","babel-loader": "^9.1.3",# 打包时使用的 module&#xff0c; 给代码中注入新的方法# http…

基于51单片机的四路抢答器Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了基于51单片机的八路抢答器设计。本设计中&#xff0c;51单片机充当了核心控制器的角色&#xff0c;通过IO口与各个功能模块相连接。按键模块负责检测参与者的抢答动作&#xff0c…

js替换对象内部的对象名称或属性名称-(第二篇)递归

1.代码示例&#xff1a; function replaceKey(obj, oldKey, newKey) {// 如果不是对象或者oldKey不存在&#xff0c;直接返回原对象if (typeof obj ! object || !obj || !(oldKey in obj)) return obj;// 如果是数组&#xff0c;遍历数组每个元素if (Array.isArray(obj)) {obj…

python爬虫加入进度条

安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块&#xff0c;用于处理时间相关的功能 from tqdm import * # 从tqdm包中…

ESIX配置备份和恢复

ESIX虽然重装很快&#xff0c;但是原本配置就丢失了&#xff0c;在硬件不变的情况下&#xff0c;可以使用配置备份和配置恢复的方法。 1、备份配置 1.1、执行以下两条命令 vim-cmd hostsvc/firmware/sync_configvim-cmd hostsvc/firmware/backup_config如下图&#xff0c;只需…