随笔分类 -  C/C++基础

学习C语言的同时,增加用C来描述算法的能力。C语言尽量在Linux上写。
摘要:首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换。第1部分. 相关概念解释上行转换(up-casting):把子类的指针或引用转换成基类表示。下行转换(down-casting):把基类指针或引用转换成子类表示。类型转换不安全性来源于两个方面: 其一是类型的窄化转化,会导致... 阅读全文
posted @ 2015-08-10 02:53 stemon 阅读(319) 评论(0) 推荐(1)
摘要:有关这方面的问题,首先说一点:回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员。由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐... 阅读全文
posted @ 2015-08-09 21:55 stemon 阅读(2810) 评论(1) 推荐(1)
摘要:http://c.biancheng.net/cpp/biancheng/view/239.html博客园有关C++内存布局,对象模型的文章。Effective C++ 绝不重写non-virtual函数。 阅读全文
posted @ 2015-08-08 22:28 stemon 阅读(204) 评论(0) 推荐(0)
摘要:这件事从一道面试题开始说起:#include #include #include void getmemory(char*p) { p=(char *) malloc(100); strcpy(p,"hello world"); } int main... 阅读全文
posted @ 2015-07-28 09:33 stemon 阅读(1405) 评论(0) 推荐(0)
摘要:根据前面的某一篇的文章,可以清楚的看到:对于每一个函数,通过这个函数的[ebp+x]就可以直接访问到它调用的时候传进来的形参的值,通过[ebp-x]就可以直接访问它的局部变量。所以printf这个函数不定参数的实现是通过栈机制实现的,在传入实参的时候,从右向左一次把各个参数压入栈,但是这些压入栈的数... 阅读全文
posted @ 2015-07-26 11:22 stemon 阅读(666) 评论(0) 推荐(0)
摘要:有关C++运算符的细节,先来看一个题目:int main(){ int a[] = {2, 4, 6, 8, 10}, *p, **k; p = a; k = &p; printf(" % d", *(p++)); printf(" % d\n", **k); ... 阅读全文
posted @ 2015-07-26 02:15 stemon 阅读(250) 评论(0) 推荐(0)
摘要:C++对象模型中加入多继承从单继承可以知道,派生类中只是扩充了基类的虚函数表。如果是多继承的话,又是如何扩充的?1)每个基类都有自己的虚表。2)子类的成员函数被放到了第一个基类的表中。3)内存布局中,其父类布局依次按声明顺序排列。4)每个基类的虚表中的print()函数都被overwrite成了子类... 阅读全文
posted @ 2015-07-24 15:19 stemon 阅读(332) 评论(0) 推荐(0)
摘要:在开始之前,首先科普一下cout指针的知识,这样才能在测试程序中很好的理解:看下面的代码:void main(void){ int a = 10; int *p = &a; cout << a << endl; cout << p << endl; cout << *p << endl; cout ... 阅读全文
posted @ 2015-07-24 15:00 stemon 阅读(531) 评论(0) 推荐(0)
摘要:有重写的单继承派生类中重写了基类的print()函数。//Derived_Overwrite.h#pragma once#include "base.h"class Derived_Overrite : public Base{public: Derived_Overrite(int); ... 阅读全文
posted @ 2015-07-24 11:27 stemon 阅读(243) 评论(0) 推荐(0)
摘要:C++对象模型中加入单继承不管是单继承、多继承,还是虚继承,如果基于“简单对象模型”,每一个基类都可以被派生类中的一个slot指出,该slot内包含基类对象的地址。这个机制的主要缺点是,因为间接性而导致空间和存取时间上的额外负担;优点则是派生类对象的大小不会因其基类的改变而受影响。如果基于“表格驱动... 阅读全文
posted @ 2015-07-24 09:44 stemon 阅读(368) 评论(0) 推荐(0)
摘要:如何访问成员?前面介绍了C++对象模型,下面介绍C++对象模型的对访问成员的影响。其实清楚了C++对象模型,就清楚了成员访问机制。下面分别针对数据成员和函数成员是如何访问到的,给出一个大致介绍。对象大小问题其中:3个类中的函数都是虚函数lDerived继承BaselDerived_Virtual虚继... 阅读全文
posted @ 2015-07-24 02:28 stemon 阅读(248) 评论(0) 推荐(0)
摘要:何为C++对象模型?C++对象模型可以概括为以下2部分:1 语言中直接支持面向对象程序设计的部分2 对于各种支持的底层实现机制语言中直接支持面向对象程序设计的部分,如构造函数、析构函数、虚函数、继承(单继承、多继承、虚继承)、多态等等,这也是组里其他同学之前分享过的内容。第一部分这里我简单过... 阅读全文
posted @ 2015-07-21 20:10 stemon 阅读(716) 评论(1) 推荐(0)
摘要:首先一个列子说明指针和数组真的不是一回事:浅谈C中的指针和数组(一)如果用硬是把数组和指针放在一个,一个放声明里一个放定义中,这里就能看到指针和数组名是不同的。这篇文章从符号表的角度分析一下指针和数组名的不同点,两种东西在数据访问的时候的不同点。有关不同点,再来点更深层次的东西:浅谈C中的指针和数组... 阅读全文
posted @ 2015-07-15 09:33 stemon 阅读(209) 评论(0) 推荐(0)
摘要:freopen是被包含于C标准库头文件中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境。C99函数声明:FILE *freopen(const char * restrict filename, const char * restrict mode, FILE ... 阅读全文
posted @ 2015-06-23 15:49 stemon 阅读(710) 评论(0) 推荐(0)
摘要:新建工程的时候选择:Win32 Console Application在向导的地方勾选MFC头文件支持,确认即可等待初始化文件完成后,VS2010会自动打开 项目名.cpp的文件其中int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])这个相当于main... 阅读全文
posted @ 2015-06-11 11:21 stemon 阅读(3093) 评论(0) 推荐(0)
摘要:折半查找又称为二分查找。这种查找方法要求查找表的数据是线性结构保存,并且还要求查找表中的数据是按关键字由小到大有序排列。折半查找(二分查找)是一种简单而又高效的查找算法,其查找长度至多为㏒2n+1(判定树的深度),平均查找长度为㏒2(n+1)-1,效率比顺序查找要高,但折半查找只能适用于顺序存储有序... 阅读全文
posted @ 2015-05-04 11:43 stemon 阅读(833) 评论(0) 推荐(0)
摘要:私有成员变量的概念,在脑海中的现象是,以private关键字声明,是类的实现部分,不对外公开,不能在对象外部访问对象的私有成员变量.然而,在实现拷贝构造函数和赋值符函数时,在函数里利用对象直接访问了私有成员变量,因而,产生了困惑.下面以具体实例进行说明:疑惑:为什么第26行和第32行代码可以编译通过... 阅读全文
posted @ 2015-04-29 16:56 stemon 阅读(469) 评论(0) 推荐(0)
摘要:在C++中, 构造函数,拷贝构造函数,析构函数和赋值函数(赋值运算符重载)是最基本不过的需要掌握的知识。在effective C++中说过这么一点:拷贝构造函数的参数必须是引用类型的。但是为什么呢?拷贝构造函数的参数必须是引用类型的如果拷贝构造函数中的参数不是一个引用,即形如CClass(const... 阅读全文
posted @ 2015-04-29 16:20 stemon 阅读(1419) 评论(0) 推荐(0)
摘要:C++在创建对象的时候,有三种方式:#include using namespace std;class A{private: int n;public: A(int m):n(m) { } ~A(){}};int main(){ A a(1); //栈中分配 ... 阅读全文
posted @ 2015-04-29 13:55 stemon 阅读(2323) 评论(0) 推荐(1)
摘要:看下面的两个类的声明代码:class B{public: void mf(); //something to do};class D : public B{public: void mf();}; 如果有下面的调用:D x;//第一种调用B *pB = &x;pB->mf();//调用B::m... 阅读全文
posted @ 2015-04-21 20:54 stemon 阅读(376) 评论(0) 推荐(0)