
cpp
文章平均质量分 85
aiyaya730
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ 实现 C# delegate 机制
C# 里的 delegateC# 里的 delegate 作为语法特性的一部分,使用起来非常方便。首先按照函数签名,声明一个 delegate 类型:delegate void DelegateType();之后就可以用这个 delegate 类型来声明 delegate 变量了。DelegateType delegateMetods;再之后,就可以用这个 delegate 类型的变量,来 注册 / 注销监听函数了。比如我们有两个函数 Test1,Test2void Test1() {}原创 2020-12-15 17:59:36 · 1470 阅读 · 2 评论 -
operator new placement new 的基础介绍
c++ 可以使用 new 表达式 构造对象.class ClassA{public: ClassA() { printf("ClassA::ClassA()\n"); }};int main(){ ClassA* a = new ClassA(); return 0;}main 函数里面调用的 new ClassA() 里的 new ,即 new 表达式。 new 表达式背后做了 两件事 :调用 operator new 分配一段原始原创 2020-12-07 06:11:02 · 395 阅读 · 0 评论 -
[C++学习] C++ Primer 第4版 习题4.28 C++动态数组
这个习题需要注意以下知识点: 1. C++ 支持动态数组,可以用 int * p = new int [XXX];这样来定义. 这样定义的动态数组,如果是 语言内置类型的(比如 int 之类),是没有进行过初始化的;如果是 类类型的 ,会调用 默认的构造函数. 如果希望 内置类型也进行初始化,则需要加个空括号 int *p = new int[XXXX]()原创 2012-04-02 21:38:15 · 633 阅读 · 0 评论 -
[C++学习] operator 的 2种用途
转自 http://blog.youkuaiyun.com/happyhell/article/details/4043982C++中的operator,有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换)。下面分别进行介绍: 1.operator overloadingC++可能通过operator 重载转载 2012-12-21 10:38:40 · 1138 阅读 · 0 评论 -
[c++笔记] 调用父类带参的构造函数
调用父类带参的构造函数,需要用构造函数列表。如CParent 有 CParent::CParent() 有 CParent::CParent(int num),如果子类CChild想在构造函数里面,调用 CParent::CParent(int num) 而不是 CParent::CParent(),需要写在构造函数列表里,CChild::CChild() : CParent(原创 2014-02-11 14:47:22 · 899 阅读 · 0 评论 -
std::map查询效率优化
0.现状,数据是个xml文件,每个节点对应的结构体有10个成员变量,共有2000多条数据,用的std::map来保存,用map的find函数进行搜索时的效率极 其低下,循环搜索30条数据竟然要20s+,搓死。 1.为什么这么慢?最初怀疑是std::map的效率问题,正考虑是否使用std::hast_map来替换,于是了解下两者之间的差别:std::map是个自平衡的红黑树,转载 2014-10-12 13:44:44 · 5067 阅读 · 1 评论 -
为什么不要在构造函数中调用虚函数
为什么不要在构造函数中调用虚函数转自 http://www.cnblogs.com/carter2000/archive/2012/04/28/2474960.html先看一段在构造函数中直接调用虚函数的代码: 1 #include 2 3 class Base 4 { 5 public: 6 Base() { Foo(); } //转载 2014-11-29 23:26:07 · 643 阅读 · 0 评论 -
c++ typeid详解
在揭开typeid神秘面纱之前,我们先来了解一下RTTI(Run-Time Type Identification,运行时类型识别),它使程序能够获取由基指针或引用所指向的对象的实际派生类型,即允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid。 dynam转载 2015-05-05 11:01:11 · 614 阅读 · 0 评论 -
理解 std::function 和 function::bind 的用法
岁数越大越不爱接受新鲜事物,比如 c++ 11要不是 cocos2dx 3.几的引擎在用 c++11 的特性,可能我永远也不会看.这篇文章介绍 std::function 和 std::bind 比较清楚,转载如下.稍微需要注意的是,当成员非静态函数有 2 个参数时候, std::bind 的参数里,需要写成 std::placeholders_1,std::placehold转载 2015-05-06 23:26:34 · 835 阅读 · 0 评论 -
c++ 带参数的宏定义 实现反射机制
lua 这种脚本语言用久了,总觉得反射机制就应该理所当然的嵌入在语言特性里。比如希望根据自己传的类名变量,动态去 new 一些实例。在 lua ,js 里做起来就非常简单,然而在 c++里面做起来,就需要稍微费些周折。好在 c++ 宏定义 支持传入参数, 仿佛就是专门给反射机制设计的。写的时候参考 cocos2dx CREATE_FUNC 这个宏#define CREATE_FUN原创 2017-04-03 00:45:46 · 2102 阅读 · 0 评论 -
[c/c++]宏定义,#,##
转自 https://blog.youkuaiyun.com/believefym/article/details/1836162# —— 字符串 ##——连接两个参数#include <iostream>using namespace std;#define TEST(pid) (cout<<para##pid<<endl);#define TEST2...转载 2018-06-08 00:24:36 · 219 阅读 · 0 评论 -
C++ 动态创建对象
转自https://blog.youkuaiyun.com/jnu_simba/article/details/9318799回顾前面的文章,实现了一个简单工厂模式来创建不同类对象,但由于c++没有类似new "Circle"之类的语法,导致CreateShape 函数中需要不断地ifelse地去判断,如果有多个不同类对象需要创建,显然这是很费神的,下面通过宏定义注册的方法来实现动态创建对象。Shape.h:...转载 2018-06-08 00:33:40 · 5439 阅读 · 1 评论 -
详解C语言可变参数va_list和vsnprintf及printf实现
转自 https://blog.youkuaiyun.com/cbNotes/article/details/38760025C语言的变长参数在平时做开发时很少会在自己设计的接口中用到,但我们最常用的接口printf就是使用的变长参数接口,在感受到printf强大的魅力的同时,是否想挖据一下到底printf是如何实现的呢?这里我们一起来挖掘一下C语言变长参数的奥秘。先考虑这样一个问题:如果我们不使用C标...转载 2018-10-31 01:00:14 · 1272 阅读 · 0 评论 -
c++多线程 thread mutex 使用小结
c++多线程 thread mutex 使用小结std::thread std::mutex 基本使用方法std::thread 用于开启一个线程。std::mutex 是互斥锁,防止不同线程间的代码在不同线程间做不安全的切换std::mutex try_lock()子线程作生产者、主线程做消费者子线程做加载、主线程显示百分比多线程里遇到的几个问题:c++对于多线程的支持,依赖于 std::th...原创 2018-11-11 23:02:31 · 9707 阅读 · 1 评论 -
C++的一种错误写法:用引用类型接收值类型返回值函数的返回值
观察下面的错误代码,函数的返回值是值类型,在外面接收返回值时,使用引用类型。CTest getTest(){ CTest t; return t;}CTest& test = getTest();在vs2017里面,这样写代码竟然在编译阶段不报错,而且运行也正常。在 xcode 的编译器下,直接会报错不能用引用类型,来接收值类型的参数。这种写法,语意上,有一种“接收了局...原创 2018-11-16 00:02:53 · 658 阅读 · 0 评论 -
c/c++ 几个双下划线 实用的内置宏
c/c++ 几个双下划线 实用的内置宏这几个宏分别是__FILE__ 文件路径文件名 字符串__FUNCTION__ 函数名 字符串__LINE__ 行号 数字__TIME__ 编译时间 字符串__DATE__ 编译日期 字符串printf("%s %s %d %s %s",__FILE__,__FUNCTION__,__LINE__,__DATE__,__TIM...原创 2019-04-19 16:55:01 · 3628 阅读 · 0 评论 -
[c++] delete 只有声明没有定义的指针时遇到的问题
今天遇到这样一个问题:class AParent 有一个成员 BParent* ptr 初始化为 nullptrclass AChild 作为 AParent 的子类,ptr = new BChild , 其中 BChild 是 BParent 的子类为了减少编译时的依赖, AParent.h 上面声明了 class BParent;在 AParent.cpp 里面虽然调用了 delete...原创 2019-08-31 21:33:24 · 887 阅读 · 0 评论 -
[C++学习] effective c++ 笔记 pass by value ,pass by reference
在编写函数的返回值和形参的时候,能 传引用(pass by reference) 就不要 传值 (pass by value).这样是为了少调用 copy constructor ,可以提高效率。另外 传递& 引用,可以像用指针一样,能实现 “父类指针指向子类实例”的多态效果,传值没有多态的效果。比如有类 class Person{private: string原创 2012-12-17 01:35:02 · 3086 阅读 · 0 评论 -
[c++学习] 模板类基础
模板类通常会在头文件中,写成以下这种形式:#ifndef __C_TEST_H__#define __C_TEST_H__templateclass CThree{private: T _m1,_m2,_m3;public: CThree(T t1,T t2,T t3); T Min(); T Max();};template CThree::CThree(T原创 2012-12-17 01:42:28 · 564 阅读 · 0 评论 -
[C++学习] c++ primer 第4版 习题3.14
自己做的C++ Primer 习题.有不正确的地方敬请指正. 通过这个习题,需要注意以下几点:1. %运算级别低,需要用括号括起来.比如 if(!(i%8))如果写成 if(!i%8)完全错误.2. toupper()函数是把运算结果作为返回值传递回来,而不会直接修改参数. #include#include#include#includeusing std:原创 2012-03-27 18:54:14 · 632 阅读 · 0 评论 -
[C++学习] C++ primer 习题 3.17
自己做的习题,有错误敬请指正. 值得注意以下几点:1.iterator 的使用 2.上次没有提到,这次补上. 注意这里循环的用法:for( iter = vecStr.begin();iter!=vecStr.end();++iter,times++)结束条件是 iter != vecStr.end().包括上次的for( vector::size_t原创 2012-03-28 14:16:12 · 830 阅读 · 2 评论 -
[C++学习] c++ primer 习题3.18
值得注意的地方有以下几点: 1. iterator 一旦指向某个vector,那么这个iterator 的范围只能在 [begin(),end()]之间.如果超过了这个区间 (即使没有取到 it当前的值,只要 it本身超过了这个区间),就会在运行时报错. 测试见第2段代码. #include#include#includeusing std::cin;原创 2012-03-28 18:47:17 · 534 阅读 · 0 评论 -
[C++学习] C++ Primer 第4版 习题4.18
如有错误敬请指正. 这个习题需要注意以下几点: 1.指针的加减操作,在它指向一组元素(比如数组)的时候,是比较有意义的.指针+n ,表示 移动 n个 元素类型大小 的内存单元.即 指向往后数第n个元素.这里 n可以为 负数 ,表示指向往前数第n个元素. 2.pointer 和 array 的关系,和 iterator 和 vector 的关系非常类似,有许多相同的性原创 2012-03-30 13:38:53 · 579 阅读 · 0 评论 -
[C++ 学习] C++ primer 第4版 习题4.19
#include#include#includeusing std::cin;using std::cout;using std::endl;using std::vector;using std::string;int main(){ int i; // okay,but haven't initialized const int ic; // wrong原创 2012-03-31 12:00:49 · 1045 阅读 · 0 评论 -
[c++学习] C++ primer 第4版 习题4.20 4.21 常量指针 和 指针常量
这个习题需要注意以下知识点: 1. const int * p; 我们暂时称它为 "常量指针",即指向常量的指针.他可以指向const 常量,也可以指向非 const的变量,但是都不能通过 p 来修改它指向的对象的值.按照书里面的话说,这种指针 一厢情愿的 认为,它所指向的东西是个 const类型的. 所以它没法修改.但是如果它指向的是个变量 a,虽然不能通过 *p原创 2012-03-31 13:32:18 · 858 阅读 · 0 评论 -
[C++ 学习] C++ Primer 第4版 习题 4.30 字符串操作 & 我对堆内存 和 常量区内存的一些理解
首先随便说一个和这个习题无关的内容. 看下面一段代码,找找问题:int main(){ char *str = "test"; delete str; return 0;}这段代码会出现什么样的问题呢?在 delete str;的时候,程序会 Crash 掉。 原因是因为 "test" 是一个常量,这个常量并不驻留在 Stack 栈内存,也不驻留 在原创 2012-04-03 00:24:12 · 1466 阅读 · 0 评论 -
[C++ 学习] C++ Primer 第4版 习题 4.31
思考和尝试了多次,最终我觉得写书人出题的意图,应该就是要让学习者写这几行,不用考虑太复杂:int main(){ string str; cin>>str; const char *strDest = str.c_str(); return 0;} 需要注意以下知识点:1.string::c_str()的返回值是 const char * 不能够用一个 ch原创 2012-04-03 01:50:27 · 891 阅读 · 0 评论 -
[C++ 学习] C++ Primer 第4版 习题 4.32
这个习题需要注意以下知识点: 1.用内存位置初始化vector 的时候,相当于需要给一个 vector begin()的值,和 vector end()的值.也就是说需要首元素的位置,和末元素下一个位置. #include#include#includeusing std::string;using std::vector;int main(){ in原创 2012-04-03 17:43:23 · 553 阅读 · 0 评论 -
[C++ 学习] C++ Primer 习题 4.34 4.35
需要注意以下知识点: 1. 动态数组要记得 delete [] ,别忘了. 2.strcpy在拷贝的时候,已经包括最后面的 \0 了.相当于 strncpy,不拷贝最后的 \0,然后在最后再补一个 \0 3.string::c_str() 返回的时一个 const char *,是C风格字符串的地址. #include#include#include原创 2012-04-06 17:18:30 · 782 阅读 · 0 评论 -
[C++ 学习] 常量折叠
转载自 http://www.cnblogs.com/chenyuming507950417/ 所谓 "常量折叠",就是 const 类型的变量,在使用这个变量的时候,无视这快内存内容是什么,而是直接使用这个变量最开始的初始值. 下面是转载的内容 : 今天意外见识了这个名词是在优快云帖子里http://topic.youkuaiyun.com/u/20120406/03/转载 2012-04-06 15:38:55 · 1009 阅读 · 0 评论 -
[C++ 学习] C++ Primer 习题 4.36 指针数组 & 数组指针
这个习题需要注意以下知识点: 1.int *ip[4]; // array of pointers to int这样的表达式理解为指针数组,即这本身是个数组,这个数组中每个元素的内容 是一个指针. 但是,如果要声明一个指针,这个指针指向一个数组,如何声明呢?这需要下面的表达式:int (*ip)[4]; // pointer原创 2012-04-06 18:11:51 · 791 阅读 · 0 评论 -
[C++ 学习] C++ Primer 笔记 bitset 和 位操作
看了 c++ primer 关于位操作的章节,记录一些自己的理解. 位操作需要针对 unsigned 类型的数 进行操作.对 负数进行位操作,会依赖机器不同而结果不同,应该避免. 位操作需要针对 unsigned 类型的数 进行操作,所以能够操作的位数会受到 这个 unsigned类型的数据的 位数限制.bitset可以操作任意多位,不收类型的 位数限制.原创 2012-04-09 19:16:51 · 1117 阅读 · 0 评论 -
[C++ 学习] C++ Primer 习题 5.30 new & delete 操作符
下面的代码中,哪个语句是错的#include#include#include#includeusing std::string;using std::vector;using std::cin;using std::cout;using std::endl;using std::bitset;int main(){ vector svec(10);原创 2012-04-10 12:58:01 · 1056 阅读 · 0 评论 -
C++ Primer 习题12.38 ~ 12.41 class 中的 static 成员
第12 章主要讲类的一些基本概念.这几个习题都是跟 class 中的 static 成员相关的.有如下几点值得注意:1.static 成员的初始化 (或者说叫 定义 ),紧随 class 声明比较合适.换句话说,就是和class 声明放在同一个 .h 文件中.形如class A{static int m_iTest;};int A::m_iTest原创 2012-07-09 12:15:15 · 742 阅读 · 0 评论 -
简单的几个宏,使C++支持 interface
简单的几个宏,使C++支持 interface.自己的 C++ 基础实在有点薄弱...正文转自 http://www.cnblogs.com/flyingfish/archive/2007/06/05/772237.html面向对象的语言诸如JAVA提供了Interface来实现接口,但C++却没有这样一个东西,尽管C++通过纯虚基类实现接口,譬如COM的C++实现就是转载 2012-09-19 15:57:52 · 825 阅读 · 0 评论 -
[C++学习] 对const变量的理解.
最近在看>.零零碎碎随手记录,有不正确的地方敬请指正. 对const变量有了一个基础的理解.记录一下. const类型的变量可以分为两种:一种是用常量初始化,在编译时就可以确定值的,比如 const float PI = 3.14;另一中是用变量初始化,运行时才能确定值的,比如 const int test = func(); 头文件通常只能包含变量和函数的声明原创 2012-03-27 18:49:25 · 466 阅读 · 0 评论