首页 > 编程语言 >c++ 语法 引用

c++ 语法 引用

时间:2024-05-23 16:52:44浏览次数:14  
标签:函数 成员 派生类 c++ C++ 语法 引用 基类 变量

 

 

引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。

C++ 引用 vs 指针

引用很容易与指针混淆,它们之间有三个主要的不同:

  • 不存在空引用。引用必须连接到一块合法的内存。
  • 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。
  • 引用必须在创建时被初始化。指针可以在任何时间被初始化。

C++ 中创建引用

试想变量名称是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容。例如:

int i = 17;

我们可以为 i 声明引用变量,如下所示:

int&  r = i;
double& s = d;

在这些声明中,& 读作引用。因此,第一个声明可以读作 "r 是一个初始化为 i 的整型引用",第二个声明可以读作 "s 是一个初始化为 d 的 double 型引用"。

==============================================

C++ 存储类

存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类:

  • auto:这是默认的存储类说明符,通常可以省略不写。auto 指定的变量具有自动存储期,即它们的生命周期仅限于定义它们的块(block)。auto 变量通常在栈上分配。

  • register:用于建议编译器将变量存储在CPU寄存器中以提高访问速度。在 C++11 及以后的版本中,register 已经是一个废弃的特性,不再具有实际作用。

  • static:用于定义具有静态存储期的变量或函数,它们的生命周期贯穿整个程序的运行期。在函数内部,static变量的值在函数调用之间保持不变。在文件内部或全局作用域,static变量具有内部链接,只能在定义它们的文件中访问。

  • extern:用于声明具有外部链接的变量或函数,它们可以在多个文件之间共享。默认情况下,全局变量和函数具有 extern 存储类。在一个文件中使用extern声明另一个文件中定义的全局变量或函数,可以实现跨文件共享。

  • mutable (C++11):用于修饰类中的成员变量,允许在const成员函数中修改这些变量的值。通常用于缓存或计数器等需要在const上下文中修改的数据。

  • thread_local (C++11):用于定义具有线程局部存储期的变量,每个线程都有自己的独立副本。线程局部变量的生命周期与线程的生命周期相同。

从 C++ 17 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。

中的存储类说明符为程序员提供了控制变量和函数生命周期及可见性的手段。

合理使用存储类说明符可以提高程序的可维护性和性能。

从 C++11 开始,register 已经失去了原有的作用,而 mutable 和 thread_local 则是新引入的特性,用于解决特定的编程问题。

=============================

class

 

类 & 对象详解

到目前为止,我们已经对 C++ 的类和对象有了基本的了解。下面的列表中还列出了其他一些 C++ 类和对象相关的概念,可以点击相应的链接进行学习。

概念描述
类成员函数 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。
类访问修饰符 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。
构造函数 & 析构函数 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。
C++ 拷贝构造函数 拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
C++ 友元函数 友元函数可以访问类的 private 和 protected 成员。
C++ 内联函数 通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。
C++ 中的 this 指针 每个对象都有一个特殊的指针 this,它指向对象本身。
C++ 中指向类的指针 指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。
C++ 类的静态成员 类的数据成员和函数成员都可以被声明为静态的。

 

 

==================================

基类 & 派生类

一个类可以派生自多个类,这意味着,它可以从多个基类继承数据和函数。定义一个派生类,我们使用一个类派生列表来指定基类。类派生列表以一个或多个基类命名,形式如下:

class derived-class: access-specifier base-class

其中,访问修饰符 access-specifier 是 public、protected 或 private 其中的一个,base-class 是之前定义过的某个类的名称。如果未使用访问修饰符 access-specifier,则默认为 private

访问控制和继承

派生类可以访问基类中所有的非私有成员。因此基类成员如果不想被派生类的成员函数访问,则应在基类中声明为 private。

我们可以根据访问权限总结出不同的访问类型,如下所示:

访问publicprotectedprivate
同一个类 yes yes yes
派生类 yes yes no
外部的类 yes no no

一个派生类继承了所有的基类方法,但下列情况除外:

  • 基类的构造函数、析构函数和拷贝构造函数。
  • 基类的重载运算符。
  • 基类的友元函数。

继承类型

当一个类派生自基类,该基类可以被继承为 public、protected 或 private 几种类型。继承类型是通过上面讲解的访问修饰符 access-specifier 来指定的。

我们几乎不使用 protected 或 private 继承,通常使用 public 继承。当使用不同类型的继承时,遵循以下几个规则:

  • 公有继承(public):当一个类派生自公有基类时,基类的公有成员也是派生类的公有成员,基类的保护成员也是派生类的保护成员,基类的私有成员不能直接被派生类访问,但是可以通过调用基类的公有保护成员来访问。
  • 保护继承(protected): 当一个类派生自保护基类时,基类的公有保护成员将成为派生类的保护成员。
  • 私有继承(private):当一个类派生自私有基类时,基类的公有保护成员将成为派生类的私有成员。

======

 

参考:

https://www.runoob.com/cplusplus/cpp-references.html

https://www.runoob.com/cplusplus/cpp-classes-objects.html

 

标签:函数,成员,派生类,c++,C++,语法,引用,基类,变量
From: https://www.cnblogs.com/rebrobot/p/18208915

相关文章

  • C++ 的 mutable 引出的一系列思考
    阅读多线程实战第六章第二节时,看到mutable关键词的使用,突然忘记它的含义=>  https://github.com/xiaoweiChen/CPP-Concurrency-In-Action-2ed-2019/blob/master/content/chapter6/6.2-chinese.md 进而引申到mutable的使用=> C++的mutable关键字......
  • Linux C++ IDE
    在linux下开发C++一般使用cmake,而我们也需要一个IDE来提高开发效率,之前使用过VSCode,这个需要装各种插件进行许多配置才能成为一个真正的IDE,后来知道了Clion是一个更好的选择。那么我们怎么使用呢?官网下载安装包,可以试用一个月,然后我们可以去淘宝买个共享帐号,我......
  • c++ 迭代器
     c++迭代器,可以理解成指针的泛化。迭代器与指针:迭代器(Iterator)是指针(pointer)的泛化,提供了对对象的间接访问。迭代器针对容器,而指针类型针对数组。迭代器与模板:模板使得算法独立于存储的数据类型,即任何数据类型都可以使用该程序设计。而迭代器使得算法独立于使用的容器类型,即任......
  • C++类中封装指针函数
      classMyClass{public:voidfunc1(){//实现}voidfunc2(){//实现}//成员函数指针类型typedefvoid(MyClass::*MemberFuncPtr)();//一个成员函数指针成员变量MemberFuncPtrptrFunc;......
  • C++高性能服务器框架—协程模块
    协程模块概述一、概念可以简单的认为:协程就是用户态的线程,但是上下文切换的时机是靠调用方(写代码的开发人员)自身去控制的;对比首先介绍一下为什么要使用协程。从了解进程,线程,协程之间的区别开始。从定义来看进程是资源分配和拥有的基本单位。进程通过内存映射拥有独立的代......
  • C++实现128位整数类
    如何编写一个128位的整数现在的大部分的计算机编程语言都包含了64位的有符号整数和无符号整数,有的甚至还提供了128位的整数和大数,比如:\(C\#\):System.Int128,System.UInt128\(Rust\):i128,u128但是在C/C++中并未发现uint128_t/int128_t,尽管在某些平台下可以看到__int1......
  • [20] C++虚幻引擎热更新
    Day1大纲行为树节点网络PDF网络系统内容Task节点FinishWithResult:MoveDirectlyToWard:PushPawnAction:运行至当前队列节点首节点 RunBehaviorDynamic:动态运行子行为树SetTagCooldown:WaitBlackboardTime:装饰器节点GamePlayTagCondition......
  • LaTeX 交叉引用的三次编译
    源文件main.tex\documentclass{article}\begin{document}Hereisacitation\cite{example}.\bibliographystyle{plain}\bibliography{references}\end{document}references.bib@article{example,author={AuthorName},title={TitleofthePap......
  • 词法分析和语法分析
    词法分析和语法分析(例子)让我们以一个简单的例子来说明词法分析和语法分析的过程,假设我们有一个非常基础的编程语言片段:x=3+5词法分析(LexicalAnalysis):读取源代码:系统首先读取这行代码的字符流。分割和识别词法单元:x 被识别为一个标识符(Identifier)。= 被识别......
  • c++ 语法摘记
    目录c++语法摘记c++获取当前时间的三种方式c++运算符优先级c++语法摘记c++获取当前时间的三种方式c++运算符优先级......