首页 > 编程语言 >C++入门

C++入门

时间:2024-08-04 16:52:33浏览次数:17  
标签:入门 int auto C++ 引用 重载 函数

目录

命名空间

IO流

缺省参数

函数重载

为什么C语言不支持重载而C++支持重载?

引用

引用特性:

常引用

使用场景

引用和指针的区别

内联函数的定义以及注意

auto关键字

自动类型推断

基于范围的for循环

命名空间

C语言中会有命名冲突,C++为了解决这个问题增加了namespace(命名空间)的用法。

在了解命名空间之前,我们先复习一下编译器的查找顺序:

但编译器不会主动查找命名空间域,需要我们展开使用。

代码示例:

#include<iostream>
using namespace std;
namespace bit
{
	// 命名空间中可以定义变量/函数/类型
	int a = 0;
	int b = 1;
	int Add(int left, int right)
	{
		return left + right;
	}
	struct Node
	{
		struct Node* next;
		int val;
	};
}
using namespace bit;
int main()
{
	printf("%d\n", bit::a);
	printf("%d\n", b);
}

IO流

IO流也被称为输入输出流。

#include<iostream>
// std是C++标准库的命名空间名,C++将标准库的定义实现都放到这个命名空间中
// << 流插入   >> 流提取
using namespace std;
int main()
{
    cout<<"Hello world!!!"<<endl;
    return 0;
}

缺省参数

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

void Func(int a, int b = 20, int c = 30)
{
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	cout << "c= " << c << endl;
}

//全缺省
void Func1(int a = 10, int b = 20, int c = 30)
{
	cout << "a= " << a << endl;
	cout << "b= " << b << endl;
	cout << "c= " << c << endl;
}

int main()
{
	Func(1, 2, 3);
	Func(1, 2);
	Func(1);
	Func1(1, 2, 3);
	Func1(1, 2);
	Func1(1);
	Func1();
}

代码运行结果:

函数重载

函数重载:是函数的一种特殊情况,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;
}

为什么C语言不支持重载而C++支持重载?

编译链接的过程:

  1. 预处理
  2. 编译
  3. 汇编
  4. 链接
  5. 链接时,C语言直接用函数名去查找,无法区分,所以不支持重载,而C++是以修饰后的函数名查找,所以支持重载。

引用

引用相当于别名。

引用特性:

  1. 引用在定义时必须初始化。
  2. 一个变量可以有多个引用,就相当于人有多个外号一样。
  3. 引用一旦引用一个实体,就不能引用其他实体。
void TestRef()
{
    int a = 10;
    // int& ra;   // 该条语句编译时会出错
    int& ra = a;
     int& rra = a;
     printf("%p  %p  %p\n", &a, &ra, &rra);  
}

常引用

void TestConstRef()
{
     const int a = 10;
     //int& ra = a;   // 该语句编译时会出错,a为常量
    const int& ra = a;
     // int& b = 10;  // 该语句编译时会出错,b为常量
    const int& b = 10;
     double d = 12.34;
     //int& rd = d;  // 该语句编译时会出错,类型不同
    const int& rd = d;
}

使用场景

  1. 做参数或者做返回值
//做参数
void Swap(int& left, int& right)
 {
     int temp = left;
     left = right;
     right = temp;
 }
//做返回值
int& Count()
 {
     static int n = 0;
     n++;
     // ...
     return n;
 }

引用和指针的区别

在语法概念上,引用就是一个别名,和引用实体共用一块空间。

在底层实现上,是有空间的,因为引用是按指针方式来实现的。

内联函数的定义以及注意

inline int func(int x)
{
    retrun x * x;
}

这个函数将被内联到调用该函数的地方,而不会创建新的栈帧和参数传递过程。

内联函数并不是在所有情况下都会内联,在某些情况下,编译器可能会选择不内联一个函数,例如函数体太大或者过于复杂。

此外内联函数也可能对程序的性能产生负面影响,因为他可能导致代码量增加,从而增加内存占和执行的时间。

auto关键字

自动类型推断

auto关键字使得编译器能够根据变量初始化表达式自动推断处变量的类型,例如

auto x = 5;
auto y = 3.14;
auto z = "hello";

这种用法减少了代码的冗长性,特别视在处理复杂类型时。

基于范围的for循环

for(范围声明 : 范围表达式)
{
    循环语句
}
//范围声明:定义一个变量用于存储范围表达式中的元素,通常使用auto关键字进行类型推断。
//范围表达式:表示要遍历的序列,如数组、容器、字符串等。

优点

  1. 简洁性:相比传统的for循环,基于范围的for循环不需要显式定义迭代器或索引变量。
  2. 安全性:减少了因索引错误或迭代器操作错误导致的bug。
  3. 易读性:代码更加直观,易于理解。

注意事项

  1. 基于范围的for循环适用于数组、容器、字符串等支持范围访问的对象。
  2. 对于空容器或序列,循环体不会执行。
  3. 在遍历中修改容器大小,可能导致未定义行为。

标签:入门,int,auto,C++,引用,重载,函数
From: https://blog.csdn.net/m0_64752704/article/details/140906972

相关文章

  • 如何处理“内部C++对象(某些对象)已删除”?
    当我关闭具有记录器的窗口然后重新打开该窗口时,我收到“RuntimeError:内部C++对象(PySide6.QtWidgets.QPlainTextEdit)已删除。”(我根据这篇文章制作了记录器:在pyqt中显示日志的最佳方式?)。当我从LoggerWindow的closeEvent中删除“self.deleteLater()”时,我没......
  • C++ 返回值类型推导
    C++返回值类型推导前言C++中获取函数签名可以很简单地用decltype(函数名)来获得,但是这样无法直接提取出返回值类型。有时我们需要获取函数或可调用对象的返回值类型,以便进行后续的操作,在泛型编程中很常用,特别是当不同的参数集的结果类型不同时。头文件<type_traits>:C......
  • kettle从入门到精通 第八十三课 ETL之kettle kettle调用python且接收返回值
    场景:kettle调用python执行脚本,处理之后,再把结果数据流发给下一个步骤。 看到有个qq群里有个小伙伴求助要实现kettle调用python脚本,然后接收python脚本执行的结果,最后将结果传递到下一个步骤。之前的课程里面介绍的是kettle通过shell步骤调用python脚本,没有接收python返回的结果......
  • 【C++核心篇】—— C++面向对象编程:封装相关语法使用和注意事项详解(全网最详细!!!)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、封装(类)1.封装的使用(类和对象)2.对象的初始化和清理2.1构造函数2.2析构函数2.3构造函数的分类及调用3.深拷贝与浅拷贝4.C++对象模型和this指针5.友元6.运算符重载前言在本篇......
  • 【C++基础篇】—— 面向对象编程前的准备(内存分区,引用、函数重载)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、内存分区模型1.C++内存分区2.new操作符二、引用三、函数重载1.函数基本使用2.函数重载前言在本篇文章中,主要是对C++的基础语法进行回顾学习,回顾学习C++的基本语法规则、数据类型......
  • CPlusPlus - #034 C++ 中的零拷贝技术
    文章目录C++中的零拷贝技术探析1前言2.1使用mmap实现零拷贝2.2使用sendfile实现零拷贝2.3优缺点和适用场合2.3.1mmap2.3.1.1优点2.3.1.2缺点2.3.1.3适用场景2.3.2sendfile2.3.2.1优点2.3.2.2缺点2.3.2.3适用场景2.4总结......
  • 【C++ STL】vector
    文章目录vector1.vector的接口1.1默认成员函数1.2容量操作1.3访问操作1.4修改操作1.5vector与常见的数据结构的对比2.vector的模拟实现2.1类的定义2.2默认成员函数迭代器的分类2.3容量接口memcpy浅拷贝问题内存增长机制reserve和resize的区别2.4修改接口......
  • 基于OpenCV C++的网络实时视频流传输——Windows下使用TCP/IP编程原理
    1.TCP/IP编程1.1概念IP是英文InternetProtocol(网络之间互连的协议)的缩写,也就是为计算机网络相互连接进行通信而设计的协议。任一系统,只要遵守IP协议就可以与因特网互连互通。所谓IP地址就是给每个遵循tcp/ip协议连接在Internet上的主机分配的一个32bit地址。按照TC......
  • 【leetcode详解】另一棵树的子树 (C++递归:思路精析&& 过程反思)
    思路详解:总体框架:对root树进行先序遍历,如果当前结点(记为cur)的值和subRoot的根节点值相等时,就开始判断 以cur为根节点的树和子树是否结构一样?如何判断两棵树是否结构完全相同?分析:一提到“树”结构,很容易想到在(先/中/后序)遍历上做文章,请教了AI后笔者得知,如果两棵树......
  • c++中的迭代器
    前言hello大家好,我是文宇。正文C++中的迭代器是一种访问容器中元素的对象。它可以看作是一种抽象的指针,通过迭代器可以便捷地遍历和操作容器中的元素,无需了解容器内部的数据结构和实现细节。迭代器提供了一组操作,包括指向容器中的元素、移动到下一个元素、访问当前元素等功......