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++ 有趣的动态转换

缘起 最近,在项目代码中看到一个非常神奇的类型转换—— 类型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++ 发展史

到了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++如何实现并发中的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++之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++数组与指针

1.数组 数组大小(元素个数)一般在编译时决定,也有少部分编译器可以运行时动态决定数组大小,比如icpc(Intel C++编译器)。 1.1数组名的意义 数组名的本质是一个文字常量,代表数组第一个元素的地址和数组的首地址。数组名本身不是一个变量,不可以寻址,且不允许为数组名赋值。假设定义数组: int A[10]; 那么再定义一个引用: int* &r=A; 这是错误的写法,因为变量A是... »

c++如何控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象。通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的。所以,如果想控制CGameWorld的实例化对象只有一个,最简单的方法就是将构造函数声明为private,同时提供一个static对象。 »

c++代码调试方式的几点建议

1.代码调试的重要性 代码调试在程序开发阶段占有举足轻重的地位,可见代码调试的重要性。但是有一点必须强调:程序是设计出来的,而不是调试出来的。这是所有程序员必须牢记在心的一条准则。一个没有设计或者这几得很糟糕的程序,无论怎样调试,也不会成为一个合格的程序。 程序有着良好的设计的前提下,软件开发的过程中,编码错误在所难免。所有程序可能出现的错误可分为两类:语法错误和逻辑错误。调试通常是指在消除了语法... »

c++ 面向对象设计五大原则

面向对象设计(OOD)是面向对象编程(OOP)必不可少的一个环节,只有好的设计,才能保障程序的质量。面向对象设计的主要任务就是类的设计,不少面向对象(OO)的先驱和前辈已经提出了很多关于类的设计原则,用于指导OOP,其中就包括类设计的五项基本原则。 1.单一职责原则(Single Resposibility Principle,SRP) 专注是一个人的优良品质,同样,单一职责也是一个类的优良设计。... »

深入了解c++11 移动语义与右值引用

1.移动语义 C++11新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力。如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升性能。参考如下程序: //moveobj.cpp #include <iostream> #include <vector> using namespace std; class Obj { publi... »

Page 1 of 73123»