
基础c/c++
tobealv
这个作者很懒,什么都没留下…
展开
-
c++分隔字符串
可以使用getline函数。原创 2024-06-24 17:40:23 · 265 阅读 · 0 评论 -
设计模式总结
为访问者提供服务,比如说家里来客人了,有各种吃的,你不是让客人自己一个一个直接去拿,而是拿个果盘放好各种吃的,把果盘提供给客人。可以看做是用一扇门挡住内部实现,比如有A、B、C等等一大堆类,统一提供一个X类,由X类引用它们,客户只用X类。简单说就是有个A类,但是出于某些原因,客户无法直接调用A类或者A类无法完全满足客户需求,于是写个B类,B类中引用A类。类实现一个功能可以提供不同的策略,说白了就是不同的方法。A类提供统一接口,但是A类不具体实现,由B类、C类等具体实现,A类维护一个它们的指针。原创 2024-06-07 09:47:03 · 334 阅读 · 0 评论 -
c++时间戳字符串
【代码】c++时间戳字符串。原创 2024-02-22 14:58:00 · 508 阅读 · 0 评论 -
c++操作浮点数
【代码】c++操作浮点数。原创 2024-02-22 14:59:11 · 388 阅读 · 0 评论 -
c++11 string和int互转
【代码】c++11 string转int。原创 2023-09-11 17:44:03 · 348 阅读 · 0 评论 -
C++:undefined reference to vtable
编译通过,编译链接时始终提示C++:undefined reference to vtable....,网上基本都说是有虚函数在子类中没定义,但我确实所有子类都实现了。其中提到了RTTI需要修改gcc的编译参数,突然想到我程序中对这些类的调用采用了智能指针,应该是类似的原因,于是cmake重新生成makefile,成功解决。最近遇到一个问题,编写了一组继承关系的类,并且包含有纯虚函数、虚函数。原创 2023-08-08 11:03:37 · 216 阅读 · 0 评论 -
C++中使用extern引用其它文件中定义的变量
假如存在A.h/A.cpp和B.cpp。如果在A.cpp中定义了int h,那么想在B.cpp中引用h的话,需要在A.h中extern int h,然后在B.cpp中include "A.h",而不能直接在B.cpp中extern int h.原创 2023-08-08 10:54:38 · 222 阅读 · 0 评论 -
c++11列表初始化
2.对于类对象的初始化,{}相当于构造函数(),其中也是写构造函数参数,当然,得有对应定义的构造函数。如果是空的{},相当于调用默认构造函数。(只要是在构造对象的地方,我们都可以用{}初始化语法为构造函数提供参数,<C++程序设计语言>17.3.2)1.{}前有无=没区别。原创 2023-07-27 12:49:45 · 81 阅读 · 0 评论 -
C++模板定义时提示undefined reference to
一般来说,写C++程序时推荐“类的声明和实现分离”,也就是说一个类的声明放在example.h文件中,而这个类的实现放在example.cpp文件中,这样方便管理,条理清晰。但是如果类的声明用到了模板template,则类的声明与实现分离是不可取的,因为这个GCC会报错,比如undefined reference to XXX等错误。所以如果用到了template需要把函数的实现放到类的声明文件中,至于函数是直接在class声明内定义,还是在class声明外定义都可以。...原创 2022-04-19 16:25:22 · 2639 阅读 · 0 评论 -
C++ note 1
1、拷贝构造函数也可以有初始化列表,在子类的拷贝构造函数中想要使父类部分采用拷贝构造的话,必须在初始化列表中显示调用父类的拷贝构造,否则的话,父类部分采用父类默认构造函数。...原创 2022-04-13 09:54:35 · 516 阅读 · 0 评论 -
C/C++中各种整型定义
包含头文件#include <stdint.h>uint8_t uint16_t uint32_t原创 2022-04-11 10:14:15 · 991 阅读 · 0 评论 -
C++忽略大小写比较字符串
Windows:stricmpLinux:#include <strings.h>strcasecmp原创 2022-04-08 15:17:06 · 821 阅读 · 0 评论 -
C++string中find,rfind 与 find_first_of,find_last_of
1、find和rfind是匹配整个字符串,find返回第一个匹配处的第一个字符位置,rfind返回最后一个匹配处的第一个字符位置。2、find_first_of和find_last_of匹配字符串中的任一字符(匹配任意一个字符就够了),find_first_of返回第一个匹配的字符位置,find_last_of返回最后一个匹配的字符位置。...原创 2022-04-08 09:13:34 · 1291 阅读 · 0 评论 -
C++ lambda表达式
string txt; auto len = [=]() -> int // 必须用后置形式声明返回值类型 { return txt.length(); }; cout << len(); // 注意,len不是代表的返回值类型,而是函数,所以要加括号原创 2022-04-07 09:34:07 · 723 阅读 · 0 评论 -
使用private类隐藏数据成员
//B.hstruct BP;class B{public: B(); ~B(); PRT();protected:private: BP *bp;};//B.cpp#include "B.h"#include <stdio.h>struct BP { int b;};B::B(){ bp = new BP(); bp->b = 3;}B::~B(){}B::PRT(){ printf("b=%d\n", bp-&.原创 2021-12-21 09:03:57 · 327 阅读 · 0 评论 -
有符号数转无符号数的扩展问题
首先,计算机中为什么要有补码?答案是使符号位参加运算,从而简化加减法的规则,使减法运算转成加法运算,从而简化机器的运算器。计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在原创 2021-09-09 11:35:35 · 1282 阅读 · 0 评论 -
C语言中的类型提升——基础概念,但还有很多人搞不清
今天主要说一下C语言的类型提升的事情。下面是引用的一个例子——这个代码是从一个朋友的博文中复制过来的,但是当时这位朋友没有去说明类型提升的问题,而是阐述汇编的过程。/***************************************************************/int main(){int i;unsigned char *p;char *p1;int a[] = {0xffffffff, 0xffffffff, 0xffffffff};转载 2021-09-09 11:32:42 · 658 阅读 · 0 评论 -
四舍六入五成双
#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <fcntl.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <time.h>#include "../apue.2e/include/apue.h"#include .原创 2021-07-30 14:40:46 · 738 阅读 · 0 评论 -
C++右值引用和std::move
关于“右值引用”不用想太多为什么,可以理解为,它只是为了告诉编译器要移动不要拷贝,以及释放原主人的所有权。std::move也可以用于指针,至于为何连指针这种轻型变量也用移动,可能主要也是出于编译器对于移动就要求这么做。...原创 2021-06-25 10:05:58 · 182 阅读 · 0 评论 -
二进制字符串转十进制数字
unsigned int bin2int (std::string strBin){ unsigned int i = 0; const char *pch = strBin.c_str(); while (*pch == '0' || *pch == '1') { i <<= 1; i |= *pch++ - '0'; } return i;}原创 2021-01-20 17:53:47 · 993 阅读 · 1 评论 -
位运算如何对某一位置0或者置1
写成宏,方便移植#define setbit(x,y) x|=(1<<y) //将X的第Y位置1#define clrbit(x,y) x&=!(1<<y) //将X的第Y位清0原创 2020-04-13 10:28:16 · 5246 阅读 · 0 评论 -
printf和sprintf中输出%
在格式化字符串中,有时候含有%,则用两个%%原创 2014-08-28 21:36:05 · 1445 阅读 · 0 评论 -
c++ const理解
1. 如果A是const对象,B是非const对象,则A拷贝给B是允许的。因为这是拷贝,对B更改不会影响到A。2. 如果A是const对象,R是对A的引用,则R必须定义为对常量对象的引用,因为不允许通过R修改A: const int ci = 1024; const int &r1 = ci; // 正确,引用及其对应的对象都是常量 r1 = 42; ...原创 2020-01-08 16:20:21 · 474 阅读 · 0 评论 -
C++派生类对象构造顺序
构造依如下顺序:1. 调用本类的基类的构造函数1.1 按照基类成员定义顺序对每个成员执行初始化1.2 执行基类构造函数体2. 调用本类的构造函数2.1 按照本类成员定义顺序引用初始化列表对每个成员执行初始化2.2 执行本类构造函数体总结为一句:首先初始化本类的基类部分,然后按照声明的顺序依次初始化本类的成员。(C++Primer P531)更进一步理解构造函数体的执行顺序:基...原创 2020-01-07 17:45:31 · 1460 阅读 · 0 评论 -
dynamic_cast, dynamic_pointer_cast
1. 智能指针类型转换用static_pointer_cast,dynamic_pointer_cast等;2. dynamic_cast/dynamic_pointer_cast的转换,其类族基类中必须至少有一个虚函数,哪怕是虚析构函数。...原创 2020-01-07 13:49:00 · 706 阅读 · 0 评论 -
C++虚析构函数
1. 一般说来,凡是定义有虚函数的基类,析构函数都应当定义为虚析构函数。2. 虚析构函数的作用在于,用一个基类指针指向一个派生类对象时,在对基类指针执行delete时,如果基类析构函数不是虚函数,则只会调用基类的析构函数,而不会调用派生类的析构函数,会造成内存泄露,基类把析构函数定义成虚函数,则在调用派生类的析构函数后,会再调用基类的析构函数。当然了,如果对派生类指针执行delete,则无论基...原创 2020-01-06 10:08:13 · 261 阅读 · 0 评论 -
C++动态库导出模板类(函数)
由于模板实例化是在编译时执行,如果在动态库中导出模板类(函数),因为实际的调用代码是在外部exe中,不在动态库本身中,所以在编译生成动态库的时候是不会生成实例的,这样在编译外部exe的时候就会报链接错误。所以无法在动态库中直接导出模板类(函数),当然,在动态库内部可以使用模板技术。...原创 2019-12-25 15:26:42 · 3315 阅读 · 0 评论 -
c++ note
1.函数可以返回指针类型,表示为,如:int *Fun(){....}2.函数参数里面加个void表示什么参数都没有,即Fun()和Fun(void)是等价的3.函数形参是被分配内存空间的,这一点与函数内部局部变量本质上是一样的;而普通类型形参的传递便是实参内容的复制,也就是用实参的值初始化形参;引用类型的形参则跟引用类型的变量一样,是实参的别名4.int *p = 0;是把指针变量p初始化...原创 2011-01-08 17:25:00 · 904 阅读 · 0 评论 -
c++定义对象语法
class A{};A a;//正确A a();//错误,编译器会认作函数调用A *p = new a();//正确,指定调用A的默认构造函数A *p = new a;// 正确,也会调用A的默认构造函数new出的对象,其内部成员,会自动初始化为0,当然如果有默认构造函数或指定了构造函数,会调用相应的构造函数进行初始化。...原创 2019-12-02 09:30:46 · 307 阅读 · 0 评论 -
关于递归代码的理解
递归代码分为三个部分,由前至后分为:1. 终结条件,分解方法。2. 递归调用3. 业务逻辑原创 2019-11-28 08:33:10 · 291 阅读 · 0 评论 -
关于函数strtok和strtok_r的使用要点和实现原理(二)
(一)中已经介绍了使用strtok函数的一些注意事项,本篇将介绍strtok的一个应用并引出strtok_r函数。 1.一个应用实例网络上一个比较经典的例子是将字符串切分,存入结构体中。如,现有结构体typedef struct person{ char name[25]; char sex[10]; char age[4]; }Person转载 2015-04-23 14:05:30 · 365 阅读 · 0 评论 -
关于函数strtok和strtok_r的使用要点和实现原理(一)
strtok函数的使用是一个老生常谈的问题了。该函数的作用很大,争议也很大。以下的表述可能与一些资料有区别或者说与你原来的认识有差异,因此,我尽量以实验为证。交代一下实验环境是必要的,winxp+vc6.0,一个极端平民化的实验环境。本文中使用的源代码大部分来自于网络,我稍加修改作为例证。当然,本人水平有限,有不妥之处在所难免,各位见谅的同时不妨多做实验,以实验为证。strtok的函数原型转载 2015-04-23 14:03:03 · 486 阅读 · 0 评论 -
指向数组的引用;指向数组的指针;指向类成员的指针;指向类数组成员的指针;二维字符串数组指针
1、指向数组的引用int num[10];int (&rNum)[10] = num;cout 2、指向数组的指针int num[10];int (*pNum)[10] = #cout 注:int[] 和 int*不是同一种类型3、指向类成员的指针指向类成员的指针并非一般意义上的指针,它的值并非是一个真实的地址,而像是一个类成员在类中的偏原创 2012-03-31 11:41:27 · 928 阅读 · 0 评论 -
用C语言的rand()和srand()产生伪随机数的方法总结
摘要: 如果希望rand()在每次程序运行时产生的值都不一样,必须给srand(seed)中的seed一个变值,这个变值必须在每次程序运行时都不一样(比如到目前为止流逝的时间);否则,如果给seed指定的是一个定值,那么每次程序运行时rand()产生的值都会一样……标准库(被包含于中)提供两个帮助生成伪随机数的函数:函数一:int rand(void);从srand (seed)中转载 2015-03-05 11:18:40 · 1970 阅读 · 0 评论 -
数组名和数组名取地址的区别
以下代码会打印出什么样的日志呢?[cpp] view plaincopy#include int a[2] = {1,2}; int main(){ printf("a = %p\n", a); // I printf("&a = %p\n", &a); // II printf("a + 1 = %p\n转载 2015-02-28 09:13:27 · 422 阅读 · 0 评论 -
typedef总结
无法typedef一个类型,在多个文件中使用。如果多个文件必须使用相同的typedef类型。则只能用#ifndef _xx_#define _xx_#endif原创 2011-10-27 15:06:49 · 1124 阅读 · 0 评论 -
理解可变参数va_list、va_start、va_arg、va_end原理及使用方法
概述由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦;即使采用C++,如果参数个数不能确定,也很难采用函数重载.对这种情况,有些人采用指针参数来解决问题.下面就c语言中处理不定参数数目的问题进行讨论.定义大家先看几宏.在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:#define _INTSIZEOF(n) ((sizeof(n)转载 2014-03-12 13:48:20 · 561 阅读 · 0 评论 -
谈谈C++类型安全
什么是类型安全?类型安全很大程度上可以等价于内存安全,类型安全的代码不会试图访问自己没被授权的内存区域。“类型安全”常被用来形容编程语言,其根据在于该门编程语言是否提供保障类型安全的机制;有的时候也用“类型安全”形容某个程序,判别的标准在于该程序是否隐含类型错误。类型安全的编程语言与类型安全的程序之间,没有必然联系。好的程序员可以使用类型不那么安全的语言写出类型相当安全的程序,相反的,差一转载 2014-02-11 16:32:56 · 691 阅读 · 0 评论 -
关于static类成员
1 普通static变量是可以全局(整个程序,不是说哪个文件)访问的,但定义为类的static成员,就可以限制此变量只由该类访问。2 类的static成员函数中如果要访问类的成员,那么这个成员必须也是static的,这一点在设计程序时要考虑到。3 static数据成员必须在类外部定义一次,且可以借机进行初始化原创 2011-05-07 21:15:00 · 438 阅读 · 0 评论 -
string利用stringstream进行格式化
1.stringstream的> 操作符可以直接操作字符串或数值如:#ifdef _UNICODEtypedef std::wstring tstring;typedef std::wstringstream tstringstream;#elsetypedef std::string tstring;typedef std::stringstream tstrings原创 2011-10-11 09:52:22 · 2137 阅读 · 1 评论