c++

c++ 有趣的动态转换

缘起 最近,在项目代码中看到一个非常神奇的类型转换—— 类型A 的指针居然能动态转换成另外一个完全没有任何关系的类指针。这…… 完全颠覆了我的认知。 为了进一步了解这个神奇的操作,我特意模拟了项目代码中的情形,一起来看看吧。 代码简介 BaseA 和 BaseB 是两个基类,NewA 继承自 BaseA,NewB 继承自 BaseB。TestB() 会在堆上 new 一个 NewB 的对象,但是会... »

简单讲解c++ vector

在c++中,vector是一个十分有用的容器。vector在C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构和算法的模板类和函数库。vector 表示构造一个无名且含n个0的vector 对象。C++ 中Vector常用基本操作 »

谈谈C++中的单例

C++允许开发人员以变量的方式持有对象,例如:Foo foo [= Foo]。程序运行结束前会销毁所有变量,变量的析构函数将被正确调用; 在main函数退出前delete单例。 »

详解c++ 静态成员变量

类定义时的静态成员只是声明,静态成员的定义和初始化要在类之外完成 C++的static关键字可修饰类成员变量/方法,表示变量/方法不从属于特定对象,而是属于类的。仔细琢磨静态成员变量,会发现其与C++的方式既相容也矛盾,具有特殊性。 先说相容的一面。·C/C++·有声明和定义的说法:声明给出签名,定义给出具体实现。对类型而言,声明不一定能知道其对象占用空间大小,但根据定义肯定能确定内存占用。说静态... »

聊聊C++的mutable和volatile

C++中修饰数据可变的关键字有三个:const、volatile和mutable。mutable和volatile均可以和const搭配使用,但两者在使用上有比较大差别。mutablemutable只能作用在类成员上,指示其数据总是可变的。但其变量内存中的值在运行期间可能随时在改变,volatile修饰是正确做法。需要注意的是,volatile的值可能随时会变,期间会导致非预期的结果。 »

Ubuntu中使用VS Code与安装C/C++插件的教程详解

优麒麟Ubuntu20.04中使用VS Code。如下图所示:2.运行VS Code与安装C/C++插件a.运行VS Code运行VS Code,显示以下界面:b.安装C/C++插件3.编写程序a.打开文件夹(目录)点击菜单File-Open Folder…总结到此这篇关于Ubuntu中使用VS Code的教程详解的文章就介绍到这了,更多相关Ubuntu中使用VS Code内容请搜索软件开发网以前... »

c++ 入门——浅析构造函数和析构函数

前文回顾 本文档环境基于Vscode + GCC + CodeRunner 关于C++的环境搭建请参考下面链接: https://www.jb51.net/article/186542.htm 由于本人具有C#开发经验,部分相同的知识就不再赘述了。只列一下需要记录的知识。 HelloWorld cout 代表输出<< cin 代表输入 >> endl;代表换行,清空缓冲区。... »

区分c++中的声明与定义

C++编码过程中,我们经常谈及“定义”和“声明”,二者是编程过程中的基本概念。我们需要使用一个变量、类型(类、结构体、枚举、共用体)或者函数时,我们需要提前定义和声明。定义和声明的过程,就像我们向图书馆借阅书籍一般,需要先完成书籍的印刷,即创造出书籍,这是一个定义的过程,有了书籍,我们需要到图书馆完成借阅的登记手续,这是申明的过程。完成了申明,我们有了使用书籍的权限,就可以尽情的畅游在知识的海洋。... »

简述c++ 发展史

到了2017年,C++迎来了C++17标准。C++仍在不断的发展,下一个版本将是C++20,C++历史上的标准变更如下。 »

c++访问私有private成员变量的常用方法

类的对象不能直接访问类声明的私有成员变量,否则破坏了信息隐藏的目的。 在C++中,为了防止某些数据成员或成员函数从外部被直接访问,可以将它们声明为private,这样编译器会阻止任何来自外部非友元的直接访问。 私有成员变量的常用访问方法如下: (1)通过公共函数为私有成员赋值 #include <iostream> using namespace std; class Test { p... »

举例分析private的作用(c/c++学习)

c++中private的用处 我知道我们可以用 public 中的值,把private中的数据给提出来,但是还是搞不懂private该怎么用,或者说在一个具体程序中,private有什么用。 class fun{ public: void setname(string x) { name =x; } string getname() { return name; } private: string... »

一文读懂c++之static关键字

一、静态变量 与C语言一样,可以使用static说明自动变量。根据定义的位置不同,分为静态全局变量和静态局部变量。 全局变量是指在所有花括号之外声明的变量,其作用域范围是全局可见的,即在整个项目文件内都有效。使用static修饰的全局变量是静态全局变量,其作用域有所限制,仅在定义该变量的源文件内有效,项目中的其他源文件中不能使用它。 块内定义的变量是局部变量,从定义之处开始到本块结束处为止是局部变... »

浅谈c++中“::”和“:” 冒号的意思

(1) “::” 1)类作用域操作符。“::”指明了成员函数所属的类。    如:M::f(s)就表示f(s)是类M的成员函数。 2)表示域操作符。    如:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出 f 的定义,那么在类外定义 f 时, 就要写成void A::f(),表示这个f()函数是类A的成员函数。 3)命名空... »

浅谈c++如何实现并发中的Barrier

c++的基本语法和有关多线程的语法。在研究Barrier的实现中,我查阅了蛮多的资料的。所以如果按照这个类比,实现一个barrier至少需要以下的几个变量: 需要同时在barrier等待的线程的个数。当前到达barrier的线程的个数。 »

如何把C++的源代码改写成C代码的方法

C++与C区别最大的就是C++中的类的概念和特性,将C++改为C的问题,就转换成如何将类化去的问题。下面对C++的一些特性,以及如何在c里实现或者替代,作一些初步的探讨。 »

实例代码讲解c++ 继承特性

——派生类需要自己的构造函数。         派生类中可以根据需要添加额外的数据成员和成员函数,甚至可以给予继承的原成员函数新的定义。    基类指针或引用可指向派生对象,反过来则只能使用强制类型转换。    派生类对象可使用基类的非私有成员。    可使用派生对象初始化基类对象或赋值。    一般不允许将基类对象赋给派生类对... »

详细分析c++ const 指针与指向const的指针

  最近在复习C++,指针这块真的是重难点,很久了也没有去理会,今晚好好总结一下const指针,好久没有写过博客了,记录一下~ const指针的定义:   const指针是指针变量的值一经初始化,就不可以改变指向,初始化是必要的。其定义形式如下: type *const 指针名称;   声明指针时,可以在类型前或后使用关键字const,也可在两个位置都使用。例如,下面都是合法的声明,但是含义大不同... »

详解c++中的类型识别

1、类型识别的相关概念 (1)类型识别的作用   类型识别是面向对象中引入的一个新概念,主要用来判断赋值兼容性原则中的类型问题,即此时的数据类型到底是基类类型还是派生类类型?   当基类指针指向子类对象 或者基类引用成为子类对象的别名 时,就需要使用类型识别; Base *p = new Derived(); Base &r = *p 对于上面的语句,我们可以这样认识,指针p是Base类型... »

浅谈c++ 预处理器

预处理器是一些指令,指示编译器在实际编译之前所需完成的预处理。 所有的预处理器指令都是以井号(#)开头,只有空格字符可以出现在预处理指令之前。预处理指令不是 C++ 语句,所以它们不会以分号(;)结尾。 我们已经看到,之前所有的实例中都有 #include 指令。这个宏用于把头文件包含到源文件中。 C++ 还支持很多预处理指令,比如 #include、#define、#if、#else、#line... »

使用c++调用windows打印api进行打印的示例代码

前言 在近期开发的收银台项目中,需要使用打印机进行小票打印,打印流程的时序图如下所示: 在客户的使用过程中,遇到一个问题,如果机器安装了打印机驱动,那么调用厂商提供的 sdk 进行打印的话,会导致出现小票只打印一半的情况,对此,需要绕过厂商 sdk 使用系统的打印才能够解决这一问题。 在 web 端打印中,需要调用浏览器打印 api 进行网页打印。这意味着,之前后端编写的esc/pos无法复用到,... »

c++如何实现跳表(skiplist)

引言 二分查找底层依赖的是数组随机访问的特性,所以只能用数组来实现。如果数据存储在链表中,就真的没法用二分查找算法了吗?实际上,只需要对链表稍加改造,就可以支持类似“二分”的查找算法。改造之后的数据结构叫作跳表。 定义 跳表是一个随机化的数据结构。它允许快速查询一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(log n),优于普通队列的O(n)。性能上和红黑树,AVL树不相上... »

c++ 如何合并两个有序链表

1.题目要求 这是一道求职面试时经常要求手写或者机试的经典题目。 已知两个链表head1和head2各自有序,请把它们合并成一个链表依然有序。结果链表要包含head1和head2的所有节点,即使节点值相同。 注意:不能开辟新空间来存储合并后的链表。如果第一次做该题,很容易会想到使用新链表来存储合并后的有序链表。虽然可以如此实现,但是不符合常规解法和面试官的要求。 2.非递归实现 算法过程: &nb... »

c++野指针的原理以及避免方法

1.定义 指向非法的内存地址指针叫作野指针(Wild Pointer),也叫悬挂指针(Dangling Pointer),意为无法正常使用的指针。 2.出现野指针的常见情形 2.1使用未初始化的指针 出现野指针最典型的情形就是在定义指针变量之后没有对它进行初始化,如下面的程序。 #include <iostream> using namespace std; int main() { ... »

一文读懂c++11 Lambda表达式

1.简介 1.1定义 C++11新增了很多特性,Lambda表达式(Lambda expression)就是其中之一,很多语言都提供了 Lambda 表达式,如 Python,Java ,C#等。本质上, Lambda 表达式是一个可调用的代码单元[1]^{[1]}[1]。实际上是一个闭包(closure),类似于一个匿名函数,拥有捕获所在作用域中变量的能力,能够将函数做为对象一样使用,通常用来实... »

c++禁止函数的传值调用的方法

代码编译运行环境:VS2017+Debug+Win32 按照参数形式的不同,C++应该有三种函数调用方式:传值调用、引用调用和指针调用。对于基本数据类型的变量作为实参进行参数传递时,采用传值调用与引用调用和指针调用的效率相差不大。但是,对于类类型来说,传值调用和引用调用之间的区别很大,类对象的尺寸越大,这种差别越大。 传值调用与后面两者的区别在于传值调用在进入函数体之前,会在栈上建立一个实参的副本... »

Page 1 of 73123»