c++基础(1)

c语言是结构化和模块化的语言,用于处理规模较小的程序。当问题需要高度抽象和建模时,c语言不适合。c++是基于c语言产生的,既可以进行c语言过程化程序设计,又可以以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计

namespace关键字:使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染。

如果像下面这种情况,在c语言中是解决不了的:

#include <stdio.h>
#include <stdlib.h>
int rand = 10;
int main()
{
  printf("%d\n", rand);
  return 0;
}

编译后后报错:error C2365: “rand”: 重定义;以前的定义是“函数”

命名空间定义

命名方法:使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员。

我们有不同的命名空间定义方法:

1、正常的命名空间定义

命名空间中可以定义变量/函数/类型

namespace pearl
{
   int rand=10;
   int Add(int left, int right)
   {
      return left + right;
    }
   Struct Node
   {
      Struct Node* next;
      int val;
    };
}

2、命名空间可以嵌套

//test.cpp

namespace pearl1
{
   namespace pearl2
   {
      int Add(int a,int b)
      {
         return a+b;
      }
    }
}

3、同一个工程中可以出现命名相同的空间,并且编译器最终会合成在同一个命名空间当中

//test.h

namespace pearl1
{
   int Sub(int a,int b)
   {
      return a-b;
    }
}

注意:一个命名空间就定义了一个作用域,命名空间所有的内容都局限在该命名空间当中

命名空间的使用

比如我们在命名空间当中定义了一个变量,我们该如何把它调用出来呢?

namespace pearl
{
   int a=1;
   int b=0;
   int rand=10;
   int Add(int left, int right)
   {
      return left + right;
    }
   Struct Node
   {
      Struct Node* next;
      int val;
    };
}
int main()
{
   printf("%d",a);
   return 0;
}

// 编译报错:error C2065: “a”: 未声明的标识符

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

1、加空间名称以及域作用限定符

int main()
{
    printf("%d\n", pearl1::a);
    return 0;
}
    

2、使用using将某个空间成员引入

using pearl::b;
int main()
{
    printf("%d\n", b);
    return 0; 
}

3、使用using namespace命名空间名称引入

using namespce pearl;
int main()
{
    printf("%d\n", pearl::a);
    printf("%d\n", b);
    Add(10, 20);
    return 0;    
}

这里a和b都能够被正常打印出来。 

c++输入和输出

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

注意:

使用cout(标准输出对象(控制台))和cin(标准输入对象(键盘))时,必须包含<iostream>标准头文件以及按照命名空间使用方法使用std。

cout和cin是全局的流对象,endl是特殊的C++符号,表示换行输出,他们都包含在包含< iostream >头文件中。

是流插入运算符,>>是流提取运算符。并且在c++中的输入和输出可以自动识别变量的类型。

std命名空间的使用惯例

在日常练习中,建议直接using namespace std即可。

如果在大型的开发项目当中,直接展开,会出现比较多的问题,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式就可以了。

缺省参数

概念

是在C++声明或定义函数时,为函数的参数指定一个默认值。在调用该函数时,如果没有为某个参数指定实参(即没有显式地传递一个值给这个参数),则该函数将自动采用该参数的默认值。如果调用时提供了实参,则使用指定的实参值。

分类

全缺省参数

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

半缺省参数

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

注意事项

1半缺省参数必须从右往左给,不能跳着给。

2缺省参数不能在定义和声明中同时出现。

如果声明与定义位置同时出现缺省参数,恰巧两个位置提供的值不同,那编译器就无法确定到底用哪个缺省值。

3缺省值必须是常量或者全局变量

函数重载

概念

在同一作用域,使用相同名称且功能类似的同名函数,这些同名函数的形参列表不同,来处理不同数据类型的问题。

1、参数类型不同

#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(int left, int right)
{
 cout << "double Add(int left, int right)" << endl;
 return left + right;
}

2、参数个数不同

void Add()
{
   cout << "f()" << endl;
}

void Add(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++不支持呢

review:一个程序需要运行起来,需要经过预处理,编译,汇编,链接这四个过程。

实际的项目通常由多个源文件和多个头文件组成,在编译后链接前,当addB.obj中调用的函数地址只在addA.obj(在addA.cpp中定义)中存在,我们就会进行链接。链接器在看到addB.obj调用obj时,就会到addA.obj中的符号表找到Add的地址,然后链接到一起。

每个编译器都有自己的命名规则,那么链接器会在哪儿寻找Add函数呢?

c语言

在Linux下,采用gcc编译后,函数名的修饰不发生改变。

c++

在Linux下,采用g++编译后,函数名的修饰发生改变。 会在编译过程中将函数的参数类型信息(以及其他可能需要的信息,如模板参数等)添加到函数的名字中。

引用

定义

引用不是定义一个新的变量,而是原有的变量有了新的别名,并不需要为这个别名开辟一个新的空间,它和引用的变量公用一块存储空间。

规则 :引用类型&引用变量名=引用实体名;

int &ra=a;

引用变量必须和引用实体是同种类型的。

引用特性

1引用前必须初始化

2一个实体可以被多次引用

3一个引用变量名只能使用一次,不能再引用其他实体

常引用

下面我将会逐个讲解下面代码错误的地方,以及如何修正

void TestConstRef()
{
    const int a = 10;
    int& ra = a;  
    const int& ra = a;
    int& b = 10; 
    const int& b = 10;
    double d = 12.34;
    int& rd = d; 
    const int& rd = d;
}

    const int a = 10;
    int& ra = a;     错误 ,不能将非常量引用绑定到常量对象上

   const int& ra = a;  正确
   

2  int& b = 10; 

错误,不能将非常量引用绑定到字面量上

   const int& b = 10; 正确

3      double d = 12.34;  
    int& rd = d;   
 错误,类型不同

const int&rd=d; 正确

权限可以缩小,但不能被放大。

用法

1作为参数

void swap(int&left,int&right)
{
   temp=left;
   left=right;
   right=temp;
}

2作为函数的返回值

int &count()
{
  static int n=0;
  n++;
  return n;
}
  
int& Add(int a, int b)
{
    int c = a + b;
    return c;
}
int main()
{
    int& ret = Add(1, 2);
    Add(3, 4);
    cout << "Add(1, 2) is :"<< ret <<endl;
    return 0;
}

Add函数运行结束之后,栈帧就被销毁了,c变量就没有意义了。但是空间被回收指的是空间不能使用,仍然可以通过引用找到这个值。 

在调用函数结束后,如果返回对象还在(未还给系统),可以使用引用返回,如果返回对象已经还给系统,就要使用传值返回。

传值传址效率比较

采用传值返回时,返回的并不是值本身,而是该实参或者返回变量的一份临时拷贝,因此效率非常低下。

在语法层面上,引用是不占空间的。

但是在底层逻辑层面,引用需要占一块空间。

int main()
{  
   int a=10;
   int &ra=a;
   ra=20;
   
   int *p=&a;
   *p=20;
   return 0;
}

引用和指针的区别

1 引用必须要初始化,指针可以不用初始化

2 引用在引用时只能引用一个实体,而多个指针可以指向同一个实体

3sizeof的结果不同,引用中计算的是引用内容的大小,而指针是地址空间的大小

4引用中+1是引用的实体加一,而指针是偏移一个类型大小

5指针需要显示解引用,指针只需要自己处理

6引用比指针更加安全

内联函数

概念

以inline修饰的函数叫作内联函数,在gcc编译器下,只有内联函数才会展开

auto关键字

编译器会通过变量初始化的表达式来推断变量的类型。(编译器在编译时期推导而得)它并不是一种类型的声明,而是一种类型的占位符。编译器在编译时期会替换成实际的类型。

auto的使用细则

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pico+unity手柄和摄像机控制初级设置

1、摄像头配置 摄像头模式、floor是追踪原点类型&#xff08;将根据设备检测到地面的高度来计算追踪原点&#xff09;&#xff0c; Device 模式时&#xff0c;为通常理解的 Eye 模式&#xff0c;不会将根据设备检测到地面的高度来计算追踪原点 选择floor时&#xff0c;修改相…

达梦数据库的系统视图v$recover_status

达梦数据库的系统视图v$recover_status 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$RECOVER_STATUS 是一个系统视图&#xff0c;用于显示数据库的恢复状态信息。这个视图对于数据库管理员来说非常重要&#xff0c;尤其是在数据库发生故障需要进行恢复操…

Claude 3.5 Sonnet模型发布,对比ChatGPT4o孰强孰弱

Anthropic 这家生而为打击 OpenAI 安全问题的公司&#xff0c;正式发布了Claude 3.5 Sonnet模型&#xff01; 用官网的话就是&#xff1a; 今天&#xff0c;我们推出了 Claude 3.5 Sonnet&#xff0c;这是我们即将推出的 Claude 3.5 型号系列中的第一个版本。Claude 3.5 Sonne…

批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现

本次文章更新内容&#xff0c;图片以及扫描的PDF也可以支持批量提取指定区域内容了&#xff0c;主要是通过截图指定区域&#xff0c;然后使用OCR来识别该区域的文字来实现的&#xff0c;所以精度可能会有点不够&#xff0c;但是如果是数字的话&#xff0c;问题不大&#xff1b;…

在线工具--将Json结构映射为另外一种Json结构

具体请前往&#xff1a;在线工具-将json结构映射为另外一个json结构

Home Assistant在windows环境安装

Home Assistant是什么&#xff1f; Home Assistant 是一个开源的智能家居平台&#xff0c;旨在通过集成各种智能设备和服务&#xff0c;提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备&#xff0c;包括灯光、温度、安全系统、…

算法 —— 高精度(模拟)

目录 加法高精度 两个正整数相加 两个正小数相加 两正数相加 减法高精度 两个正整数相减 两个正小数相减 两正数相减 加减法总结 乘法高精度 两个正整数相乘 两个正小数相乘 乘法总结 加法高精度 题目来源洛谷&#xff1a;P1601 AB Problem&#xff08;高精&#x…

JVM知识点

一、java内存区域与内存异常 1、运行时数据区域 1&#xff09;程序计数器 程序计数器&#xff08;Program Counter Register&#xff09;是一块较小的内存空间&#xff0c;它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里 [1] &#xff0c;字节码…

降本增效CRKD:通过跨模态知识蒸馏增强相机与毫米波雷达目标检测精度

Abstract 在自动驾驶的3D目标检测领域&#xff0c;激光雷达-摄像头&#xff08;LC&#xff09;融合是表现最好的传感器配置。然而&#xff0c;激光雷达的成本相对较高&#xff0c;这阻碍了该技术在消费者汽车中的普及。相反&#xff0c;摄像头和雷达已经普遍部署在现有车辆上&…

Springboot整合MyBatis实现数据库查询(二)

目录 第一章、准备1.1&#xff09;准备数据库表1.2&#xff09;创建springboot项目&#xff0c;添加依赖1.3&#xff09;使用mybatis逆向工程 第二章、代码开发2.1&#xff09;建包并编写代码2.2&#xff09;application配置文件2.3&#xff09;设置编译位置 第三章、测试访问3…

用HTML和CSS实现提示工具(tooltip)及HTML元素的定位

所谓提示工具&#xff0c;是指将鼠标移动到某个HTML元素&#xff08;工具&#xff09;时会显示一些提示内容&#xff08;提示文本&#xff09;&#xff0c;而鼠标移出工具元素的范围时提示文本就消失了。考虑到提示文本元素应当在鼠标进入工具元素时显示&#xff0c;鼠标离开工…

JDK之使用keytool安装cer证书

可针对https请求缺失证书解决报错&#xff1a; PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 解决办法&#xff1a; 先通过浏览器下载证书&#xff0c;再使用JDK自带…

互联网末法时代的一些思考

这篇文章也是临时起意&#xff0c;很长一段时间没写个人思考类的文章&#xff0c;主要原因也是时间完全不够用。随着年龄的增长&#xff0c;看待问题的视角也逐渐发生变化&#xff0c;例如从关注现象到关注动机&#xff0c;从关注结果到关注起因&#xff0c;2021年的时代我曾经…

时间序列问题解题(基于经验模型,使用机器学习模型)(Datawhale AI 夏令营)

示例题目&#xff1a;2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 一&#xff0c;时间序列问题概述 1、时间序列问题定义 时间序列问题是一类重要的统计和数据分析问题&#xff0c;它涉及对按时间顺序排列的数据点进行分析、建模和预测。时间序列数据是由一系列随时…

【Apache Doris】周FAQ集锦:第 14 期

【Apache Doris】周FAQ集锦&#xff1a;第 14 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户…

支持CF高帧率的免费虚拟机系统

分享一个支持CF高帧率的免费虚拟机系统&#xff0c;这个是某UP主分享的&#xff0c;帧率也是能到两百帧吧&#xff0c;内存这些我开的是6h6g的&#xff0c;具体还是得看你们自己的电脑配置&#xff01;文件较大&#xff0c;请先保存再下载&#xff0c;因为我也不知道哪天取消分…

Julia 初学者指南(一) | 安装、配置及编译器

唠唠闲话 Julia 是一种高性能的动态编程语言&#xff0c;特别适用于数值分析和计算科学领域。它拥有一个强大的类型系统和灵活的多重分派机制&#xff0c;这使得代码易于编写同时还能保持接近 C 语言的运行速度。此外&#xff0c;Julia 也能无缝调用 C 和 Fortran 库&#xff0…

有关电力电子技术的一些相关仿真和分析:⑤交-直-交全桥逆变+全波整流结构电路(MATLAB/Siumlink仿真)

全桥逆变+全波整流结构 参数:Vin=500V, Vo=200V, T=2:1:1, RL=10Ω, fs=100kHz, L=1mH, C=100uF (1)给定输入电压,输出电压和主电路参数,仿真研究电路工作原理,分析工作时序; (2)调节负载电阻,实现电流连续和断续,并仿真验证; (3)调节占空比,分析占空比与电…

公司想无偿裁员,同事赖着不走

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 这招好像也不错! 事情是这样的&#xff1a;某公司准备把成本高的员工都裁掉&#xff0c;主要包含研发部和程序员&#xff0c;总共18个人&#xff0c;准备裁掉10人&#xff0c;因为他们工资开的太高了&#xff0c;…

ROS-机械臂——从零构建机器人模型

URDF建模 URDF URDF&#xff0c;全称为 Unified Robot Description Format&#xff08;统一机器人描述格式&#xff09;&#xff0c;是一种用于描述机器人几何结构和运动学属性的标准文件格式。URDF 文件通常用于机器人模拟、路径规划、控制算法开发和可视化等领域&#xff0c…