
CPlusPlus
形形色色的人
这个作者很懒,什么都没留下…
展开
-
虚函数的使用
虚函数使用的条件:继承,virtual指定函数,父类指针或引用指向子类对象的地址其中父类的析构函数需要为virtual,保证了内存的正确释放。/* 设计一个汽车类vehicle,它有一个两个参数的构造函数,车轮数量wheels和车重量weights, 小汽车car类继承汽车类,其成员变量为passengers;开车类truck,成员变量:passengers和负载payload原创 2015-09-05 14:13:47 · 357 阅读 · 1 评论 -
c++中.dll与.lib文件的生成
_declspec(dllexport)int add(int a, int b);_declspec(dllexport)int minus(int a, int b);#include "Source.h"int add(int a, int b){ return a + b;}int minus(int a, int b){ return a - b;}原创 2016-08-25 16:46:51 · 363 阅读 · 0 评论 -
类与类的指针
#include #include"parent.h"#include "child.h"//类而言,数据是私有的,代码是共享//空指针可以调用方法,涉及内部成员会崩溃 (main4)/* 1.父类指针引用父类对象,完全正常引用(main1) 2.子类指针引用子类对象,覆盖父类的同名函数(main1) 3.父类指针引用子类对象,只能引用父类中的函数(main2) 4.子类指原创 2016-10-10 14:24:04 · 475 阅读 · 0 评论 -
C++编程经验-返回局部变量的讨论
返回局部变量没问题 如果返回局部变量有问题,函数的意义还有吗? 全局变量还用返回吗? 返回指向局部变量的指针才有问题, 函数退栈之后,局部变量消失, 指针将指向未知区域,所以出现问题。返回局部变量的引用也是绝对不可以的。 引用只是变量的一个别名,变量本体都不存在了,引用当然也没有任何意义。 还有,如果是堆空间,可以返回,即在函数中用new申请的空间,是可以返回的。转载 2015-11-10 20:16:20 · 410 阅读 · 0 评论 -
C++重载操作符之二(输入>>,输出<<,以及乘法)
#includeusing namespace std;class Rational{private: int numerator; int denominator;public: Rational(int n,int d) :numerator(n), denominator(d){} /* 乘法操作符既可以使用成员重载又可以使用友元重载的 */ /* friend原创 2015-09-16 14:24:31 · 1628 阅读 · 1 评论 -
如何用C语言封装 C++的类,在 C里面使用 .
本文给出了一种方法。基本思想是,写一个 wrapper文件,把 C++类封装起来,对外只提供C语言的接口,和 C++i相关的都在 wrapper的实现文件里实现。1. apple.h #ifndef __APPLE_H__#define __APPLE_H__class Apple{public: enum { APPLE_COLOR_RED, APPLE_CO转载 2016-11-23 22:02:56 · 876 阅读 · 0 评论 -
C代码中如何调用C++ C++中如何调用C
注意这里的C调用C++或者C++调用C意思是.c文件中调用.cpp文件中代码,或者相反。集成开发环境如VC++6.0或者vs都是以文件后缀来区别当前要编译的是C代码还是C++代码,然后采用响应的编译、调用协议等。使用extern "C" 主要是因为C编译器编译函数时不带参数的类型信息,只包含函数的符号名字。如 int foo( float x )C编译器会将此函数编译成类似_foo转载 2016-11-23 22:16:27 · 286 阅读 · 0 评论 -
Effective C++ 条款10: 令operator= 返回一个reference to *this
拷贝操作符AdvString operator= (AdvString &str)#define _CRT_SECURE_NO_WARNINGS#include using namespace std;class AdvString{public: AdvString() { len = 128; m_p = new char[len]; strcpy(m原创 2016-09-27 11:39:37 · 389 阅读 · 0 评论 -
C++11智能指针之unique_ptr
1. 智能指针概念智能指针是基于RAII机制实现的类(模板),具有指针的行为(重载了operator*与operator->操作符),可以“智能”地销毁其所指对象。C++11中有unique_ptr、shared_ptr与weak_ptr等智能指针,可以对动态资源进行管理2. unique_ptr概念unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个uniq原创 2017-01-03 11:27:57 · 448 阅读 · 0 评论 -
C++ 匿名对象
#include using namespace std;class Cat{public: Cat() { cout << "Cat construct" << endl; } Cat(Cat& obj) { cout << "Cat copy construct" << endl; } ~Cat() { cout << "Cat destruct"原创 2017-01-04 16:28:21 · 610 阅读 · 0 评论 -
STL中的仿函数
#include #include #include using namespace std;templateclass Print{public: void operator()(const T&elm) { cout << elm << ' '; }};struct Plus{ int operator()(const int& x, const int&原创 2017-01-04 23:49:00 · 573 阅读 · 0 评论 -
C++STL内存配置的设计思想与关键源码分析
说明:我认为要读懂STL中allocator部分的源码,并汲取它的思想,至少以下几点知识你要了解:operator new和operator delete、handler函数以及一点模板知识。否则,下面你很可能看不大明白,补充点知识再学习STL源码比较好。下面会结合关键源码分析C++STL(SGI版本)的内存配置器设计思想。关键词既然是“思想”,所以重点也就呼之欲出了。 1、all转载 2017-01-14 21:40:03 · 228 阅读 · 0 评论 -
stl之std::alloctor 配置器源码
#include "new.h"#include #include #include #include "iostream.h"#include "algobase.h"template inline _Tp* allocate(ptrdiff_t __size, _Tp*) { set_new_handler(0); _Tp* __tmp = (_Tp*)(::原创 2017-01-15 21:48:02 · 468 阅读 · 0 评论 -
C++ 内存分配(new,operator new)详解
转自:http://blog.youkuaiyun.com/wudaijun/article/details/9273339本文主要讲述C++ new关键字和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用。一. new operator 和 operator newnew oper转载 2017-01-15 23:13:39 · 364 阅读 · 0 评论 -
stl_alloc.h
#ifndef __SGI_STL_INTERNAL_ALLOC_H#define __SGI_STL_INTERNAL_ALLOC_H#ifdef __SUNPRO_CC# define __PRIVATE public // Extra access restrictions prevent us from really making some things // pri原创 2017-01-16 17:34:03 · 481 阅读 · 0 评论 -
一般函数指针和类的成员函数指针
函数指针是通过指向函数的指针间接调用函数。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。1、指向一般函数的指针函数指针的声明中就包括了函数的参数类型、顺序和返回值,只能把相匹配的函数地址赋值给函数指针。为了封装同类型的函数,可以把函数指针作为转载 2017-01-12 10:36:43 · 233 阅读 · 0 评论 -
C++虚函数表剖析
转载: http://blog.youkuaiyun.com/lihao21一、概述为了实现C++的多态,C++使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。二、类的虚表每个包含了虚函数的类都包含一个虚表。 我们知道,当一个类(A)继承另一个类(B)时,类A会继承类B的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也转载 2016-09-14 11:59:32 · 270 阅读 · 0 评论 -
类模板语法基础
#include #include using namespace std;//类模板的创建//类中的属性,类型参数化//我们把数据类型,进一步 抽象化。。。//抽象化的数据类型,不能直接使用。。template class A{public: T getT() { return t; } void setT(T t) { this->t = t; }原创 2016-09-13 16:10:56 · 335 阅读 · 0 评论 -
函数模板
#include #include using namespace std;//函数模板template int compare(const T&t1, const T&t2){ if (t1 > t2) return 1; if (t1 < t2)return -1; return 0;}class Stu{};int main(){ string s1 =原创 2016-09-13 11:25:34 · 292 阅读 · 0 评论 -
C++类型装换
const int n = 10; const_cast(n) = 20; cout << n << endl;//10 const int *p0 = &n; cout 编译器优化的结果。其实n已经被const_cast转变了,其值为20.原创 2015-09-05 11:13:36 · 589 阅读 · 1 评论 -
C/C++中的static使用
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后,尽管该变量还继续存在,但不能使用它。(2)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋值。数值型变量自动赋初值0,字符型原创 2015-09-05 21:59:36 · 414 阅读 · 1 评论 -
VS2013跟友元有仇
本文写了友元函数,友元成员和友元类。所有的访问其他类的友元函数,必须在被访问的类之后定义,这一点是在VS上出现的,貌似g++不是这样的。Mark下,不然自己写的时候很困惑!#includeusing namespace std;class Screen;//友元类class Window_Mgr{public: Window_Mgr(){}; ~Windo原创 2015-09-05 21:02:30 · 972 阅读 · 1 评论 -
指针重复释放
int main(){ char *name = new char[20]; memset(name, '\0', sizeof(name)); char *p1 = NULL; char *p2 = NULL; p1 = name; p2 = name; delete p1; delete p2; //导致奔溃 return 0;}原创 2015-09-06 17:18:16 · 2168 阅读 · 2 评论 -
空指针调用类的方法
有下面的一个简单的类:class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};转载 2015-09-07 14:06:59 · 973 阅读 · 1 评论 -
Effective_C++_条款三十三:避免遮掩继承而来的名称
首先理解下成员函数的重载、覆盖(override)与隐藏重载与覆盖成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)const函数或者指向const的指针#includeusing namespace std;class Base{public: virtual void function() { }原创 2015-09-11 10:17:05 · 416 阅读 · 1 评论 -
智能指针(一):STL auto_ptr实现原理
1.基础版本(构造函数和析构函数)2.改进版本(重载运算符使类用起来像指针)3.完善版本(复制构造)4.源码(C++ STL的auto_ptr实现(位于memory头文件中))5.auto_ptr的缺陷原创 2015-09-06 22:22:06 · 595 阅读 · 1 评论 -
智能指针(二):shared_ptr实现原理
前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针,顾名思义,有个shared表明共享嘛.所以shared_ptr类型的智能指针可以做为STL容器的元素下面我们来瞧瞧shared_ptr具体是咋实现的.相较auto_ptr有下面几个不同的地方:原创 2015-09-08 16:35:41 · 1118 阅读 · 1 评论 -
函数对象,函数指针,指针函数
#includeusing namespace std;/* 一个函数对象,即一个重载了括号操作符“()”的对象。 当用该对象调用此操作符时,其表现形式如同普通函数调用一般,因此取名叫函数对象。*/class FunctionObjType{public: void operator()() { cout << "test functi原创 2015-09-15 14:40:58 · 388 阅读 · 1 评论 -
C++ 重载操作符之一(指针运算符*,->)
//重载指针运算符*,->#include using namespace std;templateclass MyPtr{private: T * m_ptr;public: MyPtr(T* ptr = NULL) :m_ptr(ptr){} T& operator*()const { return *m_ptr; } //重载箭头 T * operator原创 2015-09-06 23:24:03 · 7959 阅读 · 1 评论 -
_stdcall与_cdel
1. _cdecl(1). 是C Declaration的缩写,表示C语言默认的函数调用方法,实际上也是C++的默认的函数调用方法。(2). 所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。具体所示:调用方的函数调用->被调用函数的执行->被调用函数的结果返回->调用方清除调整堆栈。(3). 被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚原创 2015-09-19 23:19:13 · 1746 阅读 · 1 评论 -
数组指针和指针数组的区别(转)
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a;转载 2015-09-20 23:29:42 · 405 阅读 · 0 评论 -
最值得阅读学习的 10 个 C 语言开源项目代码
1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。下载链接:http://home.tiscali.cz/~cz210552/webbench.htm转载 2015-10-12 16:42:51 · 443 阅读 · 0 评论 -
effective c++ 条款23 perfer nonmember nonfreind function to member function
/* * main.cpp * * Created on: Sep 23, 2015 * Author: lili0506 */#include"Rational.h"int main(){ Rational oneFourth(1,4); Rational result; result = oneFourth * 2; result = 2 * one原创 2015-09-24 17:16:16 · 396 阅读 · 0 评论 -
证明静态函数在main函数运行前就运行了
#include#includeusing namespace std;class static_name{public: static_name(){}; static int static_print();private: static int i_static_value;};int static_name::static_print(){ printf("原创 2015-12-10 21:51:47 · 464 阅读 · 0 评论 -
C++中的typeid关键字
用以返回一个变量或数据类型的“类型”。用法如下: coutint a;cout输出如下:intint如果有类A,且有虚函数,类B,C,D都是从类A派生的,且都重定义了类A中的虚函数,这时有类A的指针p,再把对象类B的对象的地址赋给指针p,则typeid(p).name()将返回的类型将是A*, 因为这里的p表示的是一个指针, 该指针是类型为A的指针, 所以返转载 2016-06-28 23:12:35 · 285 阅读 · 0 评论 -
C++ 回调函数
静态函数作为回调函数和非静态函数作为回调函数的俩个示例原创 2017-02-16 16:14:31 · 447 阅读 · 0 评论