- 博客(25)
- 资源 (3)
- 收藏
- 关注
原创 当结构体遇上宏定义,以及函数指针的高级写法(结构体中能用宏定义一个函数?)
一、结构体中可以定义一般的宏定义 如:struct aaa{ #define STATUS_1 100 #define STATUS_2 200 #define STATUS_3 300 ........}; 首先,这里的宏定义是在预编译阶段完成的,编译器此时并不知道什么结构体,所以这些宏是全局可见的。 一个宏定义,如果写在结构体之内,即使与结构体之外的宏定义
2016-03-10 09:37:40 5923
原创 拷贝构造函数的参数为什么必须是引用?
我们知道类中经常要用到拷贝构造函数,但是在使用的时候有没有想过,为什么他的参数必须是引用? 不是引用不行么?
2015-08-25 11:18:23 5525 2
原创 父类指针能否找到子类成员及定位虚指针
多态实现时能否找到子类独有的成员: 先看如下代码:class Parent{public: int a; int b; void SetA(int a) { this->a = a; } virtual void printA() { cout << "Parent" << endl; }};
2015-07-28 12:48:08 1638
原创 C++类中静态变量和静态方法的注意事项
一 静态变量 1、静态变量必须在外部定义和赋值 a、不能在 main() 函数中定义 b、不能在类的构造函数中定义 2、必须要定义静态变量,否则该变量没有内存空间(类中只是申明) 3、类本身可以直接调用静态变量 4、静态变量依旧符合public、private、protect特性 二 静态方法 1、静态方法可以被类直接调用,但是同静态变量一样符合public、priva
2015-07-26 13:51:04 9215 1
转载 C++中模板类使用友元模板函数
问题始于学习数据结构,自己编写一个单链表,其中用到了重载输出运算符<<,我写的大约这样:template <class T> class List{ friend std::ostream& operator << (std::ostream& os,const List<T>& slist); //……};用vs2008可编译,但无法链接:无法解析的外部符号后来上网查改为t
2015-07-21 00:32:39 593
原创 为什么要用虚析构函数
1 问题引出:为什么要使用虚析构函数?class A //父亲{public: ~A() { cout << "调用了父亲的析构函数"<<endl; }};class B : public A //儿子{public: ~B() { cout << "调用了儿子的析构函数" << endl; }};int
2015-07-15 17:57:48 887
转载 C++虚函数
C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次:class A{public:virtual void foo() { cout << "A::foo() is called" << endl;}};class B: public A{p
2015-07-14 13:25:53 491
转载 虚函数、虚指针和虚表
关于虚函数的背景知识用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数。存在虚函数的类都有一个一维的虚函数表叫做虚表。类的对象有一个指向虚表开始的虚指针。虚表是和类对应的,虚表指针是和对象对应的。多态性是一个接口多种实现,是面向对象的核心。分为类的多态性和函数的多态性。多态用虚函数来实现,结合动态绑定。纯虚函数是虚函数再加上= 0。并且该函数只有声明,没有实现。抽象类是指
2015-07-13 19:03:51 603
转载 构造函数为什么不能是虚函数
从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。从使用角度,虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那
2015-07-13 18:29:52 435
原创 虚指针存在证明及虚函数表
C++多态的实现原理是依赖虚指针来辨别具体使用家族类中的哪一个函数。以下就来证明虚指针的存在。我们知道,指针的大小在一般情况下是4个字节,所以我们建立一个虚函数,再来计算该类的大小,便可以验证虚函数的存在。代码如下:#include <iostream>using namespace std;class A{public: void print ()
2015-07-13 16:14:14 1021 1
原创 C++面向对象模型
1、 基础知识C++编译器如何完成面向对象理论到计算机程序的转化? 换句话:C++编译器是如何管理类、对象、类和对象之间的关系 具体的说:具体对象调用类写的方法,那,c++编译器是如何区分,是那个具体的类,调用这个方法那? 思考一下程序结果#include "iostream"using namespace std;class C1{public:int i; //4int j; //
2015-07-13 13:32:01 774
原创 类中重载和重写的区别
函数重载 必须在同一个类中进行 子类无法重载父类的函数,父类同名函数将被名称覆盖 重载是在编译期间根据参数类型和个数决定函数调用 函数重写 必须发生于父类与子类之间 并且父类与子类中的函数必须有完全相同的原型 使用virtual声明之后能够产生多态(如果不使用virtual,那叫重定义) 多态是在运行期间根据具体对象的类型决定函
2015-07-13 13:08:36 760
原创 类中static并没有那么简单
class A{public: static int a; void printA () { cout << a << endl; }};void main (){
2015-07-12 11:14:36 416
原创 继承时的初始化列表
问题引出:class Test{public: Test(int a, int b) { this->a = a; this->b = b; }private:
2015-07-11 19:34:02 1047
原创 操作符重载:什么时候返回引用
返回一个已经存在的对象或者变量时最好返回一个引用(可以避免返回值做左值时的一些麻烦,以及不用生成匿名变量,可以节约资源,提高效率。),如:Complex & operator++(Complex & c){ c .a ++; c .b ++; return c ;}返回一个临时变量时,那么不要返
2015-07-10 20:31:50 1058
原创 函数的返回值当左值
如果函数的返回值要当左值,那么必须返回一个引用:class Array{private: int mLength; int* mSpace;public: Array(int length){if( length < 0 ) {length = 0; }mLength = length;mSpace = new int[mLength];}
2015-07-10 15:22:56 771
原创 部分运算符只能用友元函数(全局函数)重载 以及链式法则
有些运算符只能用友元函数(全局函数)重载,无法使用成员函数重载,如:class Complex{public: Complex() { } Complex(int a,int b) {
2015-07-10 12:46:57 2661
原创 operator= 要注意避免内存泄露(项目经验)
指针不论是指向malloc还是new分配得到的内存,一定要注意在改变指针指向之前一定要先释放旧的内存块。class Test{public: Test() { if (p != NULL)
2015-07-08 17:14:40 490
原创 C++编译器对类中成员函数的处理(引用this指针)
定义对象的过程可以理解为: Test t(1,2)=====> Test (this,1,2)====> Test (&t,1,2)
2015-07-07 16:12:40 513
原创 c++ public、private和protected区别
private:访问范围:1.该类的成员函数。2.其友元函数访问。不能被任何其他访问,该类的对象也不能访问。(自己和最好的朋友 的成员函数可以访问你的私密信息,徒弟不可以访问)protected:访问范围:1.该类的成员函数。2.派生类中的函数(包括派生类友元函数,徒弟的朋友也可以访问哦)。3.其友元函数访问。(自己、徒弟(包含徒弟朋友,既然让徒弟继承,当然徒弟也可
2015-07-05 12:19:09 634
原创 const类型指针与普通指针相互赋值
1、将const char *p1赋给char *p2在c语言条件下是警告,c++下面是报错。2将char *p1赋给const char *p2均编译通过。总结:说明只能条件越来越严格,不能条件越来越松(除非强制类型转换如:char *p1;const char *p2;p1=(char*)p2;)。char *const p1赋
2015-04-17 00:34:32 3397
原创 数组变量名能否++(int a [10];a++;)
int a [10]; int *p ; a++; //错误,a是数组的首地址,a的指针设定为常量,不允许修改 //原因是,a如果被修改,在语句块结束后,系统无法找到地址来回收栈空间。 //类似的p=(char
2015-04-14 12:31:30 1510
原创 100!(100的阶乘)后面有几个0问题
如100!后面有几个0?解:只有2和5组合才可以得到一个末尾的0,能分解成2的有很多,如2,4,6,8都可以分解出2。但是能分解出5的就比较少,如5,10,15,20,25。。。。,所以能分解出多少个5,末尾就有多少个0。也就是说100中5的倍数有100/5=20个;而且25的倍数都可以分解出2个5,因此遇到25,,50,75,100要再多加一个5,25的倍数有4个;能分解
2015-04-14 12:18:27 1612
原创 Oracle11g64位下使用PLSQL
PLSQL只有32位版的,安装的时候会出现各样的问题,我一开始按照百度经验,或者CSDN写的去操作了,但是还是有问题,而且不同的文章写的方法居然还不一样,这就让我头大了,接下来我就对各个文章做一个汇总,再加上自己的一些改进,本人亲测可用。首先我使用的是WIN8的虚拟机(其他环境下也差不多):步骤一:安装PLSQL和64位Oracle数据库首先安装PLSQL和64位Oracle数据库,以
2015-04-14 10:08:38 895
00_DriversSetupWizard.exe
2020-01-24
数据结构演示工具
2015-07-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人