![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
weixin_41318405
此人不懒,什么都留下了
展开
-
再论单例模式 之 懒汉模式
之前的一篇单例模式帖子:https://blog.csdn.net/weixin_41318405/article/details/84586957这次探讨懒汉模式细节问题。先来看一段代码class Data{public: Data() { std::cout << this << "Data()\n"; } ~Data() { st...原创 2019-08-29 12:37:46 · 289 阅读 · 1 评论 -
继承——菱形虚拟继承
一、问题提出多继承:一个子类有两个或者两个以上的父类称这个继承为多继承。多继承中有一类特殊继承,那就是菱形继承;为什么特殊,因为菱形继承会导致访问成员的二义性和数据冗余。#include<iostream>class B{public: int _b;};class C1 :public B{public: int _c1;};cl...原创 2018-04-22 19:10:26 · 248 阅读 · 0 评论 -
C++只能在栈上创建对象、只能在堆上创建对象和单例模型
面试题1:只能在堆上创建对象 class HeapOnly{public: //静态成员(静态区)都是在程序结束释放 //必须是静态的,否则该函数需要对象调用 static HeapOnly* Create(int data = 0) { HeapOnly *p = new HeapOnly; p->_data = data; return p; ...原创 2018-11-28 16:52:55 · 685 阅读 · 1 评论 -
栈和堆的区别
内存主要分为五部分,从下到上(地址增加的方向)依次是代码区、数据段(以初始化和未初始化)、堆、栈和共享区。其中堆和栈是相向而生,栈是向下增长,堆是向上增长。代码段:主要存储一些可执行的代码和字符串常量。数据段:存储全局数据和静态数据堆:程序运行开辟的动态内存区。栈:存储非static修饰局部变量、函数参数和函数返回值。共享区:动态库就是位于此处,而且可以使用系统调用接口创建共享...原创 2018-11-30 21:36:05 · 120 阅读 · 0 评论 -
static(C语言和C++)汇总
c语言关于中static在C语言中static既可以修饰变量也可以修饰函数。static修饰变量又分为修饰局部变量和修饰全局变量。static修饰函数改变的是函数的链接属性。一、static修饰局部变量,改变变量的生命周期,作用域不发生变化。局部变量定义在函数内部,在调用函数时给变量分配栈空间,函数调用结束,释放该变量空间。但是加上static修饰称为静态局部变量。如果我们希望函数调用...原创 2018-11-30 20:23:05 · 239 阅读 · 0 评论 -
static(C语言和C++)汇总
c语言关于中static在C语言中static既可以修饰变量也可以修饰函数。static修饰变量又分为修饰局部变量和修饰全局变量。static修饰函数改变的是函数的链接属性。一、static修饰局部变量,改变变量的生命周期,作用域不发生变化。局部变量定义在函数内部,在调用函数时给变量分配栈空间,函数调用结束,释放该变量空间。但是加上static修饰称为静态局部变量。如果我们希望函数调用...原创 2018-05-19 23:45:48 · 228 阅读 · 0 评论 -
const修饰类的成员
c语言const是一个只读变量,在C语言中修饰一个标识符时,这个标识符本质依然还是一个变量,但是具有常量属性,不能直接被修改。可以使用数组验证。(1)const修饰指针const int *p 相当于const *p *p表示p所指向的内容,所以*p不可改变,p可变 int const *p相当于const *p *p不可改变,p可变 int *const p相当于...原创 2018-11-25 14:34:29 · 1373 阅读 · 0 评论 -
友元函数、友元类
重载<<class Date{public: Date(int year = 1900, int month = 1,int day = 1) :_year(year) , _month(month) , _day(day) {} ostream& operator<<(ostream& _cout); private: in...原创 2018-04-25 16:53:54 · 145 阅读 · 0 评论 -
内联函数、const、auto(C++11)、基于范围for循环(C++11)和nullptr(C++11)
一、内联函数在C语言中宏主要分为两种一种是宏常量,另外一种是宏函数。在程序运行预处理阶段,会进行宏替换。但是在C语言中宏函数不可以调试、参数检验而且容易造成副作用如后置++等、代码膨胀。所以在C++中分别用const和内联函数来替代C语言中#define定义的宏常量和宏函数。在这里我们提到了const,那么C和C++中const有什么区别?其实在C语言中const修饰的变量本质还是一个变量...原创 2018-11-16 18:58:49 · 2081 阅读 · 1 评论 -
C++缺省参数、函数重载、引用
一、缺省参数定义:缺省参数就是在声明或者定义函数时在函数参数列表中指定默认值。再调用函数时,如果没有指定实参则采用该默认值,否则采用指定的实参。分类:全缺省参数和半缺省参数注意:(1)半缺省参数必须从右向左依次给出,不可以间隔着给默认值。(2)缺省参数不可以同时出现在函数声明和定义的位置,因为如果同时出现,而且默认值不一样,编译器不知道按照哪个执行。一般在缺省我们只在函数声明位置出...原创 2018-11-16 16:57:29 · 369 阅读 · 0 评论 -
C++类与对象
C++是一门基于对象的语言,不是完全面向对象的语言(Java时一门纯面向对象的语言)。那么什么事面向对象呢?面向对象就是我们关注的时对象,我们把一件事情分成几部分来协同完成一件事,每一部分我们称为对象。C语言是一门面向过程的一门语言,面向过程就是我们把一件事情按步骤完成,每一步都是通过函数调用完成。在C语言中我们在结构体中只能定义数据成员,不可以定义函数。C++中对结构体进行了扩展,既可以定义...原创 2018-11-14 10:47:56 · 177 阅读 · 0 评论 -
常见的位运算
计算机中的数在内存中都是以二进制形式进行存储的,用位操作就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中尽量使用位运算进行操作,这会大大提高程序的性能。位操作是各大互联网公司面试经常会问的一类问题。位操作符 & 与运算 两个位都是1时,结果才为1,否则为0,如 1 0 0 1 1 & 1 1 0 0 1 -------------...原创 2018-11-05 17:59:00 · 946 阅读 · 0 评论 -
模拟operator new 和 operator delete实现内存泄漏追踪器和内存池
内存泄漏追踪器operator new 和 operator delete是两个全局函数,new/delete底层调用它们,所以我们可以模拟实现这两个全局函数,起到追踪内存的创建和销毁。已知优先调用:类成员函数>全局函数>系统函数;class Date{private: int _year; int _month; int _day;public: Date(...原创 2019-02-17 19:59:19 · 241 阅读 · 0 评论 -
简述C/C++动态内存管理
内存分布说道动态内存管理,那么一定会先想到内存分布,如下图:内存从上到下分为内核空间和用户空间,用户空间从上到下又可以分为栈、共享区、堆、数据段、代码段;栈:从上向下生长,主要存储非静态局部变量、函数参数和返回值等;堆:自下而上生长,可以看出堆和栈相向而生,中间是共享区。堆主要存储我们所自己申请的空间,C语言中我们一般使用malloc/calloc/realloc申请内存,所以需要我们自己fr...原创 2018-03-19 16:34:28 · 308 阅读 · 0 评论 -
单继承
一、继承概念及定义继承概念 继承就是代码复用、功能扩展的一种方式。简单的来说就是,在C++类中,每一个类都有自己独立的成员变量和成员函数,但也有时两个类中一部分成员是相同的或者几乎一样,例如声明两个类,其中一个学生类包含学号、姓名、性别。另外一个类是学校某一个部门除了包含学号、姓名、性别,还包含一些其他变量,如年龄、成绩等。这样我们就可以想到既然在一个学生类中声明了学号、姓名、...原创 2019-03-01 17:07:36 · 429 阅读 · 0 评论 -
C++11提供智能指针shared_ptr是不是线程安全的
“Boost文档对于shared_ptr的线程安全有一段专门的记述,内容如下:shared_ptrobjectsofferthesamelevelofthreadsafetyasbuilt-intypes.Ashared_ptrinstancecanbe"read"(accessedusingonlyconstoperations)simult...原创 2019-08-10 15:13:40 · 4803 阅读 · 3 评论 -
什么函数不能声明为虚函数?
构造函数、普通函数、inline函数、静态成员函数、友元函数1、构造函数:因为对象在运行初始化的过程中通过构造函数填充对象前四个字节为虚函数表指针,所以说构造函数是不可以给我虚函数的。2、普通函数:在实现多态调用虚函数的原理中,第二步是通过ecx寄存器传递this指针,然而普通函数没有this指针,所以不可以作为虚函数。而且普通函数是不可以被重写的。3、inline函数:内联函数是在编...原创 2019-08-09 22:36:58 · 862 阅读 · 0 评论 -
collect2: error: ld returned 1 exit status,[abi:cxx11]'被多次定义
ubuntu使用cmake报错形式:CMakeFiles/finder.dir/finder_udp.cpp.o:(.bss+0x0): `m_[abi:cxx11]'被多次定义CMakeFiles/finder.dir/finder.cpp.o:(.bss+0x0):第一次在此定义collect2: error: ld returned 1 exit statusCMakeFiles/...原创 2019-07-11 09:29:53 · 1621 阅读 · 1 评论 -
整型转字符串方法
string to_string (int val);string to_string (long val);string to_string (long long val);string to_string (unsigned val);string to_string (unsigned long val);string to_string (unsigned long long ...原创 2019-05-21 19:21:40 · 763 阅读 · 0 评论 -
智能指针
一、为什么需要智能指针如果一段程序中既申请了一段堆内存又打开好多文件,那么我们需要在程序任何可能退出去的地方进行手动关闭文件和释放堆内存,这样就程序为了关闭文件和释放堆内存导致程序看起来特别不和谐,所以提出来能否设计出我们只管使用自动释放指针呢?二、智能指针设计原理 RAll特性 重载operator*和operator->,具有和指针一样的行为 RAll特性:考...原创 2019-03-15 11:42:59 · 162 阅读 · 0 评论 -
多态
注意:以下所有代码都是在VS2013平台一、多态概念多态按字面的意思就是多种形态。同一个事物在不同的场合下具有多种形态。通俗的讲就是,见人说人话,见鬼说鬼话。举个栗子:同样是吃饭的行为,有的人吃盖浇饭,有的人吃面条。可见,同一种行为得到不同的结果。二、多态构成条件继承那块提到继承最大的作用就是实现多态。所以多态就是不同的继承关系的类对象,去调用同一个函数。除此之外还需要满足两...原创 2019-03-03 22:16:44 · 102 阅读 · 0 评论 -
vector中erase用法注意事项
以前就发现了vector中的erase方法有些诡异(^_^),稍不注意,就会出错。今天又一次遇到了,就索性总结一下,尤其是在循环体中用erase时,由于vector.begin() 和vector.end()是变化的,因此就引入了错误的可能性。erase的函数原型有两种形式:iterator erase(iterator position);iterator erase(iterato...转载 2019-03-06 14:19:32 · 387 阅读 · 0 评论 -
编译器生成默认构造函数情况
(1)类和对象:当一个A类有缺省构造函数,B类中包含A类对象,并且B类没有构造函数,那么编译器会给B类生成默认构造函数(2)继承:基类有缺省的构造函数,派生类没有显示给出构造函数。这种情况下,因为创建派生类对象会调用基类的构造函数,所以编译器认为有必要生成派生类构造函数,所以会生成一个派生类的构造函数。(3)虚拟继承:虚拟继承中派生类多了四个字节,编译器会给派生类生成一个构造函数,用于向四...原创 2019-03-03 16:48:53 · 292 阅读 · 0 评论 -
多继承和菱形继承
一、多继承多继承:一个子类有多个父类称为多继承。多继承存在问题导致二义性:派生类访问基类成员出现的不确定性。class B1{public: void SetValue() { cout << "B1::SetValue" << endl; } int _b1; int _c;};class B2{public: void Set...原创 2019-03-02 15:50:58 · 341 阅读 · 0 评论 -
C语言实现两个矩阵相乘
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#define ROW 3#define COL 3#define MID 4int main(){ int arr1[ROW][MID] = { 0 }; int arr2[MID][COL] = { 0 }; in...原创 2018-03-30 21:13:24 · 37927 阅读 · 3 评论 -
内存拷贝函数memcpy、memmove和memset函数以及内存重叠问题
内从拷贝函数可以拷贝任意内容,拷贝的个数以字节为单位,无类型【memcpy函数】原型:void *memcpy( void *dest, const void *src, size_t count );头文件:<memory.h> or <string.h>模拟实现memcpy函数:#define _CRT_SECURE_NO_WARNINGS 1#...原创 2018-05-02 00:01:40 · 332 阅读 · 0 评论 -
标准输入一个字符,并且打印,标出行号
先看下面一段代码:#define CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int main(){ char ch = 0; while ((ch = getchar()) != EOF) { putchar(ch); } system("pause"); return 0;...原创 2018-03-18 23:05:42 · 287 阅读 · 0 评论 -
C语言实现三子棋
注:玩家输入和电脑输入不要写在一个函数之内,否则不容易判断玩家输入是否赢以及电脑输入是否赢。所以我们将分别写两个函数Playermove和Computermove。//geme.h#ifndef __GAME_H__#define __GAME_H__#define ROW 3#define COL 3#include<stdio.h>#include<stdlib....原创 2018-03-30 00:33:51 · 195 阅读 · 0 评论 -
二分法
二分查找(折半查找)(递归实现二分查找) 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关...原创 2018-03-30 23:57:37 · 267 阅读 · 0 评论 -
求两个数的平均值
一、我们一般都会想到求两个平均值是(a+b)/ 2,可是当a和b是两个非常大的整数,显然会超过int的最大范围,所以这种方式不合理。二、为了解决第二种情况我们可以这样写a+(a - b)/2,这样就可以避免两个数之和越界了三、还有一种求平均值的方式是a & b + ((a^b)>>1)解释:a&b 这个表达式其实是求得两个数二进制bit位对应位相同的0或者1,当两个数...原创 2018-04-10 00:31:50 · 2988 阅读 · 0 评论 -
编写一个函数:unsigned int reverse_bit(unsigned int value);这个函数的返回值value的二进制模式从左到右反转后的值
#define CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>unsigned int reverse_bit(unsigned int value){ int i = 0; int ret = 0; int bit = 0; for (i = 0; i < 32; i++) {...原创 2018-04-17 22:52:46 · 211 阅读 · 0 评论 -
数组中只有两个数是单独出现的,其余数都成对出现,找出这两个数
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。找出这两个数字,编程实现。 本题思路:1.将0与数组每个元素依次亦或的结果就是两个只出现一次的元素亦或的值,相同元素的二进制位是相同的,亦或的值为02.将数组分为两组,每一组包含一个只出现一次的数,分组的思路是:两个唯一的数是不相同的,那么在他们的二进制序列中必然有一位是不相同的,找出这一位,以这一位为标志,将其余数进行分组。...原创 2018-04-17 23:23:14 · 863 阅读 · 0 评论 -
调整数组使得奇数全在前面,而偶数全在后面
具体思路:定义两个指针变量*begin和*end在begin<end的前提下遍历整个数组,即设置两个循环,第一个while找偶数,如果是奇数的话begin++,找到偶数退出循环。再让第二个循环从end开始找奇数,同样不是奇数end--,是奇数退出循环。紧接着交换两个数。交换完成之后在++和--,判断begin<end。以此类推程序代码如下:#define CRT_SECURE_NO_W...原创 2018-04-18 11:49:22 · 191 阅读 · 0 评论 -
在杨氏矩阵里边查找一个数是否存在
杨氏矩阵特点:从左到右递增,从上到下递增的二位数组;解题思路:以右上角元素为基准,开始比较,见下图#define CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int find_date(int arr[][3], int row,int num){ int i = 0; int j = 2...原创 2018-04-19 00:37:17 · 168 阅读 · 0 评论 -
C语言实现strlen、strcpy 、strcat 、strstr 、strchr 和strcmp
1、实现strlen()函数的三种方式(1)计数器方式#define _CRT_SECURE_NO_WARNINGS 1#include <stdio.h>#include <stdlib.h>#include<assert.h>int my_strlen(char *str){ int count = 0; while (*str) { s...原创 2018-04-26 12:49:00 · 277 阅读 · 0 评论 -
有关数组的运算(sizeof和strlen)
// 一维数组int a[] = {1,2,3,4}; printf("%d\n",sizeof(a)); //16整个数组大小printf("%d\n",sizeof(a+0)); //4 首元素地址printf("%d\n",sizeof(*a)); //4printf("%d\n",sizeof(a+1)); //4表示2的地址printf("%d\n",...原创 2018-05-02 18:34:58 · 212 阅读 · 0 评论 -
模拟实现printf函数。
在编写之前请参考【可变参数列表】printf函数原型:int printf( const char *format [, argument]... );问题:怎么让函数知道传了多少个参数?由函数%的个数知道;要知道每个参数的类型?通过%后面的字符知道;printf(“%d%x%c%f”);里面%在printf眼里就是字符串;这是第一个参数,所以整个函数就是对第一个参数字符串进行分析,遇到%特殊处理...原创 2018-05-06 13:28:02 · 294 阅读 · 0 评论 -
编写一个程序,他从标准输入读取源代码,并验证所有的花括号正确出现
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>int main(){ int ch = 0; int count = 0; while ((ch = getchar()) != EOF) { if (ch == '{') { count++; } ...原创 2018-03-17 18:02:44 · 226 阅读 · 0 评论 -
输出所有的水仙花数
水仙花数:n位数字的每位的n次方和等于这个数字本身,则称这个数字为水仙花数。#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<math.h>#include<stdlib.h>int main(){ int i = 0; for (i = 1; i <= 10000; i...原创 2018-03-17 17:31:42 · 1432 阅读 · 0 评论 -
输入一行文字,分别统计其中英文字母,空格,数字和其他字符
#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<string.h>int main(){ char arr[] = "sd 2 cd 2 4r\t wjdhf 3"; int k = sizeof(arr) / sizeof(arr[0]) -...原创 2018-03-15 23:48:38 · 736 阅读 · 0 评论