首页 > 编程语言 >C++入门补充语法

C++入门补充语法

时间:2024-09-15 16:22:48浏览次数:10  
标签:rand 函数 int C++ 语法 引用 指针 入门

1、C和C++的区别

                首先C++是包含C语言的,C语言中的所有语法在C++中都可以应用,因为C语言语法限制过多导致许多东西实现起来不方便,所以C++又制订了一系列的语法来补充C语言的不足。

2、命名空间

2.1命名空间

为什么要使用命名空间,下面我们使用一段C语言代码进行讲解:

上面的代码之所以会报错是因为,C语言在编译时会展开所有的头文件,而<stdlib.h>头文件中存在一个名叫rand的函数,该函数名与我们的全局变量rand起了冲突,所以显示rand函数重定义,我们在工作时,一个大的工程项目,可能要由多个人来完成,也会出现像今天这种请况,因此C++就引入了一个命名空间的概念。

2.2命名空间的定义

(1)定义命名空间的时候需要用到namespace关键字,后面接命名空间的名字,然后接一对{},即可{}中是命名空间的成员。

(2)namespace本质是定义出了一个域,这个域根全局域各自独立,不同的域可以定义同名变量。

(3)namespace只定义在全局,可以嵌套定义。

namespace y1
{
    namespace y2
    {
​
    }
    namespace y3
    {
​
    }
}

(4)项目工程中多文件名的namespace会认为是一个namespace,不会有冲突。

(5)C++标准库都存放在一个叫std的命名空间中。

(6)我们使用namespace中变量的时候要使用::(域访问限定符)。

2.3.命名空间问题解决

基于以上知识我们可以将代码改为:

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

这样就可以通过命名空间域来解决命名空间污染的问题了,说到这里我们有引申出一个域的概念那么神么是域呢?

2.4.域

C++中的域分为以下几种:

全局域:该域中的变量或函数生命周期为整个程序从开始到结束。

局部域:该域中的变量或函数生命周期从进入该局部域到离开该局部域。

命名空间域:该域中的变量或函数生命周期也是从程序开始到结束。

类域:该域中的变量或函数生命周期也是从程序开始到结束。

我们在进行变量查找的时候首先会先从局部变量查找,然后从全局变量中查找,如果想访问命名空间域中的变量,应该用::(域访问限定符)来制定域的名称,如果项使用类域应该吧类先实例化然后在访问类域中的成员,关于类域我们以后会重点讲解。

class ylz
{
public:
    ylz()
        :rand(30)
    {
        ;
    }
    int rand;
};
​
namespace y
{
    int rand = 20;
}
​
int fun()
{
    int rand = 40;
    return rand;
}
int main()
{
    int rand = 10;
    ylz a;
    printf("%d\n", rand);
    printf("%d\n", y::rand);
    printf("%d\n", a.rand);
    printf("%d\n", fun());
}

以上代码执行结果是10、20、30、40以上代码可以让我们直到域可以影响访问变量的顺序。

3.C++的输入与输出

(1)<iostream>是C++中标准的输入输出流库,定义了标准的输入输出对象。

(2)std::cin 是iostream类的对象,标准的输入流。

(3)std::cout 是iostream类的对象,标准的输出流。

(4)std::endl是一个函数,流插入输出时,相当于插入一个换行字符和刷新缓冲区。

(5)cout\cin\endl都属于C++的标准库,存放在std命名空间中,所以要用命名空间调用他们。

(6)<<是流插入运算符,>>是流提取运算符,他们两个都支持连续的插入和读取。

(7)一般的练习中我们可以使用using namescaps std来展开我们的命名空间域,但实际工作中我们并不建议这么做,如果工作中展开仍然有可能面临命名污染的问题。

有了以上知识点,我们可以出一个C++版的hello word代码:

#include<iostream>
int main()
{
    std::cout << "hello word" << std::endl;
    return 0;
}

4.缺省参数

(1)缺省参数是在声明或定义函数时为函数指定一个缺省值,在调用函数时若没有指定实参则采用该形参的缺省值。

(2)分为全缺省和半缺省。全缺省:全部的形参都有缺省值,半缺省:不全带缺省值的形参,至少有一个带缺省值的。

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

(4)函数声明和定义分离时,缺省值参数不能再声名和定义中同时出现,一般出现在声明中。

5.函数重载

函数重载可以使具有相同的函数名,不具有相同形参的多个函数同时存在,在C++中。

例如:

int Add(int x, int y)
{
    return x + y;
}
​
double Add(double x, double y)
{
    return x + y;
}

这样在调用整数的加法和浮点数的加法时就自动调用使用的都是Add函数,编译器会根据不用的形参选择调用的函数,这样用起来会更加方便。

6.引用

6.1引用的概念和定义

引用不是定义一块新的变量,而是用了原变量的一个别名,与被引用变量公用一块空间。

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

6.2引用的特性

(1)引用必须初始化

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

(3)引用不能改变指向

6.3引用的使用

(1)引用在实践中主要是引用传参和引用做返回值中减少拷贝和提高效率和引用对象改变时,同时改变被引用对象。

(2)引用做返回值

(3)引用与指针相辅相成,二者不可替代。

这里的使用我们在后面类和对象的章节进行重点讲解。

6.4const引用

(1)引用一个const对象必须用const引用。const也可以引用普通对象,因为对象在引用的访问权限可以放大但不可以缩小。

(2)C++在产生类型转换,返回值传参、表达式计算,这些运算结果都会存储到一个临时变量中,如果要引用这个临时变量需要,加上const修饰符。

(3)临时对象具有常性。

int main()
{
const int a = 10;
// 编译报错:error C2440 初始化: ⽆法从“const int”转换为“int &”
// 这⾥的引⽤是对a访问权限的放⼤
//int& ra = a;
// 这样才可以
const int& ra = a;
// 编译报错:error C3892: ra: 不能给常量赋值
//ra++;
// 这⾥的引⽤是对b访问权限的缩⼩
int b = 20;
const int& rb = b;
// 编译报错:error C3892:rb: 不能给常量赋值
//rb++;
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int a = 10;
const int& ra = 30;
// 编译报错: “初始化”: ⽆法从“int”转换为“int &”
// int& rb = a * 3;
const int& rb = a*3;
double d = 12.34;
// 编译报错:“初始化”: ⽆法从“double”转换为“int &”
// int& rd = d;
const int& rd = d;
return 0;
}

通过以上两段代码可以让我们更加深入地理解const引用,权限的放大和缩小只有指针和引用有。

6.5指针和引用的关系

(1)引用不开空间,指针会开空间。

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

(3)引用在引用一个对象以后不能引用其它对象,而指针可以更改指向的对象。

(4)引用可以直接用指向的对象,而指针则需要解引用后才能引用。

(5)sizeof中的含义不同,引用是引用空间的大小,而指针在相同位数的操作系统下是固定的字节大小。

(6)指针容易出现野指针和空指针的现象,而引用出现的很少,相对安全一些。

7.inline

(1)⽤inline修饰的函数叫做内联函数,编译时C++编译器会在调⽤的地⽅展开内联函数,这样调⽤内联 函数就需要建⽴栈帧了,就可以提⾼效率。

(2)inline对于编译器⽽⾔只是⼀个建议,也就是说,你加了inline编译器也可以选择在调⽤的地⽅不展 开,不同编译器关于inline什么情况展开各不相同,因为C++标准没有规定这个。inline适⽤于频繁 调⽤的短⼩函数,对于递归函数,代码相对多⼀些的函数,加上inline也会被编译器忽略。

(3)C语⾔实现宏函数也会在预处理时替换展开,但是宏函数实现很复杂很容易出错的,且不⽅便调 试,C++设计了inline⽬的就是替代C的宏函数。

(4)vs编译器 debug版本下⾯默认是不展开inline的,这样⽅便调试,debug版本想展开需要设置⼀下 以下两个地⽅。

(5)inline不建议声明和定义分离到两个⽂件,分离会导致链接错误。因为inline被展开,就没有函数地 址,链接时会出现报错。

8.nullptr

(1)C++中NULL可能被定义为字⾯常量0,或者C中被定义为⽆类型指针(void)的常量。不论采取何种 定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦,本想通过f(NULL)调⽤指针版本的 f(int)函数,但是由于NULL被定义成0,调⽤了f(int x),因此与程序的初衷相悖。f((void*)NULL); 调⽤会报错。

(2)C++11中引⼊nullptr,nullptr是⼀个特殊的关键字,nullptr是⼀种特殊类型的字⾯量,它可以转换 成任意其他类型的指针类型。使⽤nullptr定义空指针可以避免类型转换的问题,因为nullptr只能被 隐式地转换为指针类型,⽽不能被转换为整数类型。

因此我们在C++中用nullptr表示为空。

标签:rand,函数,int,C++,语法,引用,指针,入门
From: https://blog.csdn.net/2301_81496280/article/details/142285564

相关文章

  • C++资源管理浅谈
    引言:            在计算机编程语言的学习与实践中,自然避免不了与计算机的资源管理打交道。所谓的资源就是,一旦用了它,将来就必须还给系统,如果用户不这么做,那糟糕的事情便会发生。在开始谈及C++的资源管理之前,先来聊聊何为计算机的资源,以及为何要管理计算机的资......
  • 【C++】string类中常用函数的模拟实现
    【C++】string类中常用函数的模拟实现1.string.h2.Text.cpp1.string.h#include<assert.h>namespacewch{ classstring { public: typedefchar*iterator; typedefconstchar*const_iterator; iteratorbegin() { return_str; } itera......
  • C++string容器
    string容器基本概念本质:string是C++风格的字符串,而string本质上是一个类string和char*区别:char*是一个指针string是一个类,类内部封装了char*,管理这个字符串,是一个char*型的容器特点:string类内部封装了很多成员方法例如:查找find,拷贝copy,删除delete替换replac......
  • C++: 二叉树进阶面试题
    做每件事之前都心存诚意,就会事半功倍.目录前言1.根据二叉树创建字符串2.二叉树的层序遍历Ⅰ3.二叉树的层序遍历Ⅱ4.二叉树的最近公共祖先5.二叉搜索树与双向链表6.根据一棵树的前序遍历与中序遍历构造二叉树7.根据一棵树的中序遍历与后序遍历构造二叉树8.二......
  • windows C++ 并行编程-并行容器和对象
    并行模式库(PPL)包括几个容器和对象,这些容器和对象提供对其元素的线程安全访问。并发容器提供对最重要操作的并发安全访问。在这里,并发安全意味着指针或迭代器始终有效。它不保证元素初始化或特定的遍历顺序。这些容器的功能与C++标准库提供的功能类似。例如,concurren......
  • windows C++-并行编程-PPL任务并行(一)
    在并发运行时中,任务是执行特定作业并通常与其他任务并行运行的工作单元。任务可以分解为组织成任务组的其他更细化的任务。编写异步代码,并希望在异步操作完成之后进行某种操作时,可使用任务。例如,可以使用一个任务以异步方式从文件读取,然后使用另一个任务(延续任务,本文档稍后......
  • Linux操作系统入门(二)
    完成了前篇所进行的VMware下载安装,并在其内配置了CentOS7的linux操作系统之后,我们得以正式进入了Linux的世界。一.安装FinalShell在本篇中,为了更好的在Windows系统上对虚拟机中的linux操作系统进行操作,我们需要下载一款新的应用程序————FinalShell(其官网如下所示)。ht......
  • c++修炼之路之AVL树与红黑树
    目录一:AVL树1.AVL树的概念2.AVL树插入数据后平衡因子及更新的情况3.AVL树节点的定义 4.AVL树的插入及旋转 二:红黑树 1.红黑树的概念及性质2.红黑树节点的定义3.红黑树的插入操作情况 4.红黑树与AVL树的比较 接下来的日子会顺顺利利,万事胜意,生活明朗---------......
  • Linux操作系统入门(三)
    _______________________________________________一.Linux操作系统的文件结构相比于Windows操作系统的C,D,E等盘符,Linux操作系统仅有一个"/"符号的根目录.这其中存在一个显著的不同,Linux操作系统使用的是斜杠"/",而Windows操作系统中使用的是反斜杠"\"文件路径示例:"/Mus......
  • 南沙C++信奥老师解一本通题: 1161:转进制
    ​ 题目描述】用递归算法将一个十进制数X转换成任意进制数M(M≤16)。【输入】一行两个数,第一个十进制数X,第二个为进制M。【输出】输出结果。【输入样例】3116{将十进制31转化为十六进制数}【输出样例】1F#include<iostream>usingnamespacestd;intx,m;void......