`
javatgo
  • 浏览: 1175203 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

C++中的一些概念

 
阅读更多

自从学校里学过c++这门课之后就再也没有用过这门语言,最近因为项目需要才重拾c++,现在回头来看,发现有许多原来觉得很难理解的地方如果从编译的角度去理解会很容易,接下来我们就来看一下c++里的几个概念。

1、模板

大家都知道c++里的模板其实就是一个占位符,告诉编译器这里是在编译时必须用一个具体的类型来代替。而虚函数则不同,它是要在运行期绑定的,因此虚函数是无法使用模板的。

2、完整类型和非完整类型

什么叫做完整类型,什么又叫做非完整类型呢?看下面的例子:

A.hpp

class B;

class A{

public:

void print(B& b);

}

B.hpp

#include "A.hpp"

class B{

public:

void print(A& a);

}

上面这个例子里,A.hpp文件里的B就是非完整类型,而B.hpp里的A就是完整类型。为啥有这种需求呢?如果写过java或者php等其他语言的人知道,如果A类引用了B类,而B类引用了A类,那程序员根本无需担心,编译器会自己完成这种依赖检查,但是编译器是如何完成这种依赖检查的呢?很简单,其实也就是利用了上述这种办法。在解析A时如果遇到B无法解析则先占位,等到B被加载了以后再解析。而c++里这一点必须靠程序员来人肉完成。其实java和php那种结构即使靠程序人肉也无法完成这种需求,如果编译器不支持的话,原因就是java和php不像c++这种支持header和source分离的策略。

我们知道c或者c++里有可以将定义和实现分开,每个编译单元是单独编译,最后再通过链接器来加载的。那么如果要实现A类里引用了B类,并且B类里引用了A类这种需求的话,那么我们就必须使用非完整类型的,即给个占位符。这一点可以从source文件开始理解,原因是编译器其实只认source文件的。

还是上面的例子,我们补完source文件

A.cpp

#include "B.hpp"

#include "A.hpp"

void A::print(B& b)

{

b.print(*this);

}

编译器的起点其实是这个文件,它首先把B.hpp加载进来,那么B.hpp里又要加载A.hpp,而A.hpp里定义了A的实现,因此接下来的编译是成功的。

假如说我们的A.cpp里没有b.print一行,那么我们是否需要include B.hpp呢?理论上是不需要的,因为我们根据不需要B的任何方法,我们只是需要它的一个描述而已,这就是所谓非完整类型,而只有当我们需要调用它里面的方法时,我们才会遇到一个完整类型的需求。

分享到:
评论

相关推荐

    理解C++的一些概念

    对于初学者来说,理解C++的一些核心概念是至关重要的。以下是对标题和描述中涉及的一些关键知识点的详细解释: 1. **面向对象编程(Object-Oriented Programming, OOP)**:C++是面向对象的,这意味着它允许我们...

    c++概念复习总结

    总结而言,C++概念复习总结涉及到的范围很广,不仅包括语言基础,如数据类型、表达式、控制结构和函数,还包括了面向对象编程的核心要素如类、对象、继承、多态等。学习C++不仅需要掌握语法,更要理解面向对象编程的...

    C++面向对象概念介绍

    C++面向对象概念介绍,相当好的东西,值得参考!希望对你有用!

    C++课件第一章有关一些基本概念

    学习C++的过程中,理解这些基本概念至关重要。C++是一门既适合初学者也适合高级开发者的语言,它的灵活性和强大功能使其在各种领域都有广泛应用,包括系统软件、应用软件、游戏开发、嵌入式系统等。要深入掌握C++,...

    面向对象c++的基本概念

    面向对象c++的基本概念ppt,面向对象的基础知识,c++学习基础。

    C++基本概念 (面试、复习)

    在C++中标识符区分大小写,另外标识符不能和C++中的关键字相同,也不能和函数同名。 4.声明  将一个标识符引入一个作用域,此标识符必须指明类型,如果同时指定了它所代表的实体,则声明也是定义。

    C++异常的详细概念

    此PPT讲述了C++中异常的详细概念。包括:异常处理的任务;异常处理的方法;在函数声明中进行异常情况指定;在异常处理中处理析构函数。

    C++ api中文参考手册

    5. **C++基础知识**:尽管标题中提到“不全”,但“c++基础知识 不全.chm”文件可能包含了C++基础概念的简要介绍,对于初学者来说是一个不错的起点,可以快速了解C++的基本构造和用法。 总的来说,C++ API中文参考...

    学习C++的一些基础代码

    "学习C++的一些基础代码"这个标题暗示了我们将探讨的是C++语言的基本概念和语法,这对于初学者或者希望巩固基础知识的开发者来说是非常重要的。C++以其高效性、灵活性和面向对象特性而备受赞誉。 首先,让我们从C++...

    C++98、C++03、C++11、C++14、C++17、C++20的CHM查询文档

    概念库 (C++20) 错误处理 动态内存管理 日期和时间工具 字符串库 容器库 迭代器库 范围库 (C++20) 算法库 数值库 输入/输出库 文件系统库 本地化库 正则表达式库 原子操作库 线程支持库 实验性 C++ 特性 有用的资源 ...

    c++术语表 中英文对照

    这份术语表中收录了一千多个词汇,涵盖了C++编程语言的各个方面,从基本语法到高级概念、从标准库到特殊术语。下面是从这份术语表中生成的一些重要知识点: 1. 赋值运算符 (=):赋值运算符是C++中最基本的运算符之...

    《C++沉思录》是一本由 Scoot Meyers 所著的经典 C++ 编程书籍 该书深入探讨了 C++ 的一些高级概念和技术

    例如,书中会详细阐述 C++ 的类型系统、命名规则以及模板机制等基础概念,并且会进一步探讨它们如何支持现代 C++ 编程中的设计理念,如资源获取即初始化(RAII)原则。 **资源管理与 RAII:** 资源获取即初始化...

    易学C++ (Easy C++) 中文PDF文字版 附习题答案及书中源码

    11. **面向对象编程**:书中可能深入讲解了类的继承、多态性和虚函数,这些都是C++面向对象设计的关键概念。 12. **实践应用**:通过实例源文件,读者可以动手实践,将理论知识转化为实际操作能力。 习题解答.doc...

    C++中的微服务架构实现:深入解析与实践

    本文将详细介绍C++中微服务架构的实现,包括核心概念、关键技术、以及如何使用C++构建微服务。 C++在微服务架构中的应用提供了高性能和灵活性的结合。通过使用gRPC、ZeroMQ和专门的C++微服务框架,开发者可以构建出...

    C++中文教程合集 PDF高清版

    教程涵盖了从基础语法到高级特性的广泛内容,旨在帮助读者深入理解C++的核心概念和技术。 1. **C++入门**:对于初学者,了解C++的基本结构至关重要,包括变量声明、数据类型、运算符、流程控制(如if语句和循环)、...

    Essential C++中文简体版 电子书

    3. **模板**:C++中的模板是泛型编程的重要工具,允许创建可以处理多种数据类型的函数和容器。模板可以提高代码的重用性和效率。 4. **异常处理**:C++的异常处理机制允许程序员在程序运行时捕获和处理错误,提供了...

    C++中文离线手册(修正版)

    10. **C++11及其更新**:随着C++标准的不断演进,C++11、C++14、C++17和C++20引入了许多新特性,如右值引用、lambda表达式、类型推断(auto)、并发编程支持等,这些也会在手册中有所涉及。 《C++中文离线手册...

    C++大学教程C++ How to Program(中英文)

    书中的中英文双语版设计,既可以帮助中国学生更好地理解C++的概念,也可以提高他们的英语阅读能力,对于想要进一步学习国际技术文档或阅读原始源代码的程序员来说,是一大优势。通过对比两种语言的表述,可以加深对...

    think in c++ 中文

    16. **C++98/C++11新特性**:可能涵盖了一些C++98标准之后的改进,比如智能指针、lambda表达式、右值引用等。 17. **STL容器**:包括栈、队列、列表、集合、映射等,这些都是C++的标准模板库组件,极大地提高了代码...

Global site tag (gtag.js) - Google Analytics