C++
大米粒ing
只有很努力才能看起来毫不费力
展开
-
C++与Java 多态区别
1. C++中,如果父类中的函数前边标有virtual,才显现出多态。Java中,不管写不写virtual都是多态的,子类的同名函数会override父类的如果父类func是virtual的,则Super *p =new Sub();p->func(); // 调用子类的func如果不是virtual的,p->func将调用父类原来的函数。Java中,不管写不写virtua转载 2013-12-26 17:11:25 · 1106 阅读 · 0 评论 -
C++成员变量与函数内存分配
关于结构体和C++类的内存地址问题C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果类的问题通了,结构体也也就没问题啦。 类分为成员变量和成员函数,我们先来讨论成员变量。 一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)原创 2013-08-25 20:36:59 · 4059 阅读 · 1 评论 -
sizeof为什么不能计算被动态分配的数组
转自http://bbs.csdn.net/topics/210041268sizeof()只是符号表,是编译的时候确定大小的。动态分配是运行过程中得到大小的。甚至new也可能分配失败。[int占4字节,short占2字节]1.0 回答下列问题:[答案在文章末尾]1. sizeof(char) = 2. sizeof转载 2013-04-20 22:21:16 · 3067 阅读 · 1 评论 -
C++ 虚函数表解析
C++ 虚函数表解析转自:陈皓http://blog.csdn.net/haoel前言 C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函转载 2013-04-29 20:12:16 · 906 阅读 · 0 评论 -
c++类继承中内存的布局
今天在网上看到了一篇写得非常好的文章,是有关c++类继承内存布局的。看了之后获益良多,现在转在我自己的博客里面,作为以后复习之用。 本文原文出处为MSDN。如果你安装了MSDN,可以搜索到C++ Under the Hood。否则也可在网站上找到http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/d原创 2013-08-25 01:02:04 · 1294 阅读 · 0 评论 -
C++四种强制类型转换详解
什么是类型转换? 类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。C与C++的类型转换//C中://复制代码 代码如下:(T)element 或者 T(element)//c++中://复制代码 代码如下:reinterpret_cast (expression)dynami原创 2013-08-23 01:15:05 · 2398 阅读 · 0 评论 -
C/C++中的内存地址分配问题
参考网上他人写的博客,感觉不是很符合,内存的从到到底的分配顺序不符,或许是每个编译器都不十分一样,我也无法做出合理解释,但是作者所讲的各个内存区的分配是完全吻合的,本人再最后的程序作了修改,已验证我的结果。C\C++中的内存地址分配模型说明: 1、程序代码区:存放函数体的二进制代码。 2、全局区数据区:全局数据区划分为三个区域。全局变量和静态变量的存储是放在一块的,原创 2013-08-21 16:27:58 · 2093 阅读 · 0 评论 -
C/C++ 变量字节的高位、地位
就拿自由变量来说:1. 自由变量分配地址是从高地址 -> 低地址的2.多字节的变量,高位在高地址,低位在低地址。测试: #include int main (){ int x = 0x00f00fff; int y = 0xfff00f00; unsigned char *px1,*px2,*px3,*px4; unsigned char *py1,原创 2013-08-21 17:25:26 · 5068 阅读 · 2 评论 -
C++类成员常量
由于#define 定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const 修饰数据成员来实现。const 数据成员的确是存在的,但其含义却不是我们所期望的。const 数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其 const 数据成员的值可以不同。 不能在类声明中初始化 const 数据成员。以下用法是错误的,因原创 2013-08-14 17:26:47 · 1696 阅读 · 0 评论 -
C++让基类握住派生类的指针
握住派生类指针是指拥有一个派生类指针的成员,暂且不谈这样做干什么,先来看一下如何这样做// sample1.cpp#include #include #include string>using namespace std;class derived;class base{public: base() ...{转载 2013-08-26 17:21:27 · 1029 阅读 · 0 评论 -
C++ 友元关系详解
在C++中,在某些情况下,允许特定的非成员函数访问一个类的私有成员,同时仍然阻止一般的访问,这是很方便做到的。例如,被重载的操作符,如输入或输出操作符,经常需要访问类的私有数据成员。这些操作符不可能为类的成员。然而,尽管不是类的成员,它们仍是类的“接口的组成部分”。而友元机制,允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的原创 2013-05-24 20:57:28 · 1276 阅读 · 0 评论 -
Java与C++继承中的重载,覆盖和隐藏
1. Java中没有隐藏在《谈谈C++继承中的重载,覆盖和隐藏》中,我给出了隐藏的定义。但是Java根本就没有这个隐藏的概念,基类中的函数,会继承下来,和继承类中的同名函数,一起成为继承类的重载函数。请看例子:class CB { public void f(){ System.out.println("CB::f()"); }}转载 2014-08-31 20:41:52 · 1402 阅读 · 0 评论 -
(int)a、&a、(int)&a、(int&)a的区别
#include #include #include #include using namespace std;int main(){ float a = 1.0f; cout << sizeof(int) <<endl; //4 cout << sizeof(float) <<endl; //4 cout << (int)a << endl; //1 cou原创 2013-10-04 00:26:56 · 2915 阅读 · 0 评论 -
C++操作符的优先级
C++操作符的优先级C++操作符的优先级操作符及其结合性功能用法LLL::::::全局作用域类作用域 名字空间作用域 ::nameclass::namenamespace::nameLLLLL.->[]转载 2013-06-24 14:28:49 · 4346 阅读 · 0 评论 -
auto_ptr 要点解析
今天看了auto_ptr类的用法,又仔细看了看C++标准库中的符合标准的auto_ptr类别的实作,觉得自己基本上理解了auto_ptr的原理,下面就我的心得写几句,有不正确的地方,希望多多指教。1. 初始化auto_ptr(T* ptr = 0);参数必须是new申请的空间,而且不能是数组。2. 看代码:auto_ptr(auto_ptr& ths):ap(ths.release()原创 2013-09-09 00:00:33 · 1210 阅读 · 0 评论 -
C++中的三种继承public,protected,private
三种访问权限public:可以被任意实体访问protected:只允许子类及本类的成员函数访问private:只允许本类的成员函数访问 三种继承方式public 继承protect 继承private 继承 组合结果基类中 继承方式 子类中public & public继承 => publicpublic & protected继承 => pro转载 2013-08-29 20:35:20 · 1360 阅读 · 0 评论 -
模板显式、隐式实例化和(偏)特化、具体化的详细分析
最近看了看到了模板的特化,突然想起来上说的显式具体化、隐式具体化、特化、偏特化、具体化等概念弄得头晕脑胀,我在网上了找了好多帖子,才把概念给理清楚。 一下是我把再网上找的资料整理一下。 看着这么多叫法,其实就是三种。 1. 显示实例化 2. 隐式实例化 3. 特化(=具体化)、偏特化一、实例化1.显示、隐式实例化原创 2013-08-29 16:48:45 · 10565 阅读 · 2 评论 -
C++中的临时对象
临时对象的产生C++中真正的临时对象是看不见的,它们不出现在你的源代码中,临时对象的产生在如下几个时刻:1. 用构造函数作为隐式类型转换函数时,会创建临时对象。class Integer{ public: Integer(int i) :m_val(i) {} ~Integer(){} private: int原创 2013-08-15 18:47:42 · 2556 阅读 · 2 评论 -
C++ 编写模板程序
如何组织编写模板程序 前言常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。我在5年前开始使用模板,那时我看到了MFC的容器类。直到去年我还没有必要自己编写模板类。可是在我需要自己编写模板类时,我首先遇到的转载 2013-06-14 14:41:05 · 1471 阅读 · 0 评论 -
虚函数与默认实参
针对基类和派生类中的虚函数有没有默认实参问题进行讨论。1.基类虚函数不带参数,派生类带参数#includeusing namespace std; class super { public: virtual void somemethod()const { cout<<"base" << endl; }};class sub : public原创 2013-05-27 21:28:11 · 1501 阅读 · 0 评论 -
计算程序运行时间
测试编译器对于指针迭代和下标迭代是否生成相同的代码。#include #include // For clock()#include // For size_t#include // For memcpy() void copy_with_pointers(char const *src, char *dst, s原创 2013-06-25 23:02:58 · 1030 阅读 · 0 评论 -
C++ 虚析构函数 纯虚析构函数 虚构造函数
C++中析构函数可以为纯虚吗? 众所周知,在实现多态的过程中,一般将基类的析构函数设为virtual,以便在delete的时候能够多态的链式调用。那么析构函数是否可以设为纯虚呢?class CBase{ public: CBase() { printf("CBase()\n"); } v转载 2013-05-02 13:05:58 · 5894 阅读 · 3 评论 -
C++中 virtual + 析构函数
为什么基类的析构函数是虚函数? 在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生。a.第一段代码#includeusing namespace std;class A{ public: A() {} ~A() {cout << "A::~A()" << endl;} void f() { c转载 2013-04-29 21:52:37 · 797 阅读 · 0 评论 -
C++ Primer 第四版 特别版 笔记
1. C++初始化变量 赋值初始化: int ival = 1024; 直接初始化: int ival(1024);2.const 默认为文件的局部变量3.引用(&) 格式:int ival = 1024; int &refval = ival; // 引用必须初始化就绑定对象4. const 引用原创 2013-03-26 21:42:46 · 1145 阅读 · 0 评论 -
C++ 类和动态内存分配
重载特殊的一个:void name() const; // 只能被const类型的对象调用void name(); // 被一般的对象调用是个重载的函数,重载可以以函数类型和个数,以及函数限制符(const)来区别重载的函数C++自动提供了下面这些成员函数:默认构造函数,如果没有定义构造函数复制构造函数,如果没有定义赋值操作符,如果没有定义默认析构函原创 2013-04-27 16:29:09 · 1081 阅读 · 0 评论 -
传递给const引用形参的实参要求
//出自C++ primer plus(第五版) P231C++中的引用传参是给实参起了一个别名,这种参数传递方法称为按引用传递。按引用传递允许被调用的函数能够访问调用函数中的变量。但是如果函数的实参是一个表达式而不是一个左值的时候,会发生什么情况呢。如果有一个函数:double square(double &ra) { return ra * ra;转载 2013-04-22 13:28:35 · 3286 阅读 · 0 评论 -
C++中友元详解
转自http://blog.chinaunix.net/uid-790245-id-2037327.html问题的提出 我们已知道类具备封装和信息隐 藏的特性。只有类的成员函数才能访问类的私有成员,程式中的其他函数是无法访问私有成员的。非成员函数能够访问类中的公有成员,但是假如将数据成员都定义 为公有的,这又破坏了隐藏的特性。另外,应该看到在某些情况下,特别是在对某些成员函数多次调用时,转载 2013-04-13 20:35:01 · 1156 阅读 · 0 评论 -
c++创建对象的两种方式
在C++里,有两种方法创建对象:方法一:ClassName object(param);这样就声明了一个ClassName类型的object对象,C++会为它分配足够的存放对象所有成员的存储空间。注意:为节省存储空间,C++创建对象时仅分配用于保存数据成员的空间,而类中定义的成员函数则被分配到存储空间中的一个公用区域,由该类的所有对象共享。例如,我定义了一个这样的类:cla转载 2013-04-13 15:22:29 · 1006 阅读 · 0 评论 -
C++ primer 关联容器
关联容器和顺序容器的本质差别在于:关联容器通过键存储和读取元素,而顺序元素通过元素在容器中的位置顺序存储和访问元素。虽然关联容器的大部分行为与顺序容器相同,但其独特之处在于支持键的使用。关联容器通过键来高效的查找和读取元素,两个基本的关联容器为map和set。map的元素以键---值对的形式组织,键用作元素在map中的索引,而值表示存储和读取的元素。set仅包含一个键,并有效地支持关于某个键是转载 2013-04-01 22:28:34 · 717 阅读 · 0 评论 -
C++ 构造转换函数和强制转换函数
1.对于系统的预定义基本类型数据,C++提供了两种类型转换方式:隐式类型转换和显式类型转换。int a=5,sum;double b=5.55;sum=a+b;//-------(1)std::cout<<"隐式转换:a+b="<<sum<<std::endl; sum=(int)(a+b);//-------(2)sum=int(a+b);//-------(3)std::原创 2013-04-28 11:45:27 · 4119 阅读 · 1 评论 -
函数模板和类模板的实例化和具体化
一.函数模板1.显示实例化(explicit instantiation)和显示具体化(explicit specialization)的区别:(1) 形式上:显示实例化: template void Swap (int ,int);显示具体化: template (int,int); 或 template从原创 2013-05-06 00:31:05 · 2044 阅读 · 0 评论 -
C++中cin、cin.get()、cin.getline()、getline()、gets()函数详解
学C++的时候,这几个输入函数弄的有点迷糊;这里做个小结:1、cin 2、cin.get() 3、cin.getline() 4、getline() 5、gets() 6、getchar()附:cin.ignore(); cin.get()//跳过一个字符,例如不想要的回车,空格等字符1、cin>> 用法1:最基本,也是最常用的用法,输入一个原创 2013-05-08 10:51:30 · 3445 阅读 · 0 评论 -
C++ Primer学习笔记——顺序容器及相应的容器适配器
C++ Primer学习笔记——顺序容器及相应的容器适配器 本文主要讨论C++标准库中的顺序容器及相应的容器适配器,这些内容主要涉及顺序容器类型:vector、list、deque,顺序容器适配器类型:stack、queue、priority_queue。 如果文中有错误或遗漏之处,敬请指出,谢谢!概述 标准库中的容器分为顺序容器和关原创 2013-03-30 12:52:55 · 1119 阅读 · 0 评论 -
具有相同值的不同字符串常量在内存中是分开存储的
char * a="abc";char * b="abc";a和b是两个不同的指针,分别在栈中分配内存。而两个相同的字符串常量却在静态存储区内占用同一块内存。char a[]="abc";这里就不是字符串常量了,而是字符数组。不能通过指针改变字符串常量的值。可以通过字符数组改变字符串的值。原创 2013-06-25 11:25:44 · 2039 阅读 · 0 评论 -
【C++】cstddef中4个定义
size_tsize_t corresponds to the integral data type returned by the language operator sizeof and is defined in the header file (among others) as an unsigned integral type.size_t = unsigned int原创 2013-06-22 16:25:31 · 1419 阅读 · 0 评论 -
C++在单继承、多继承、虚继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容
一、本文目的与说明 1. 本文目的:理清在各种继承时,构造函数、复制构造函数、赋值操作符、析构函数的执行顺序和执行内容。 2. 说明:虽然复制构造函数属于构造函数的一种,有共同的地方,但是也具有一定的特殊性,所以在总结它的性质时将它单独列出来了。 3. 单继承、多继承、虚继承,既然都属于继承,那么虽然有一定的区别,但还是相同点比较多。如果放在一块讲,但为了将内容制作成原创 2013-06-20 19:06:49 · 1797 阅读 · 1 评论 -
C++获取文件大小常用技巧
C++编程语言在程序开发应用中能够帮助我们轻松的完成许多功能需求。比如今天为大家介绍的C++获取文件大小的方法,就可以以多种方式轻松的实现。现在将会实现方法呈现给大家,以便大家参考。C++获取文件大小代码示例:#include #include #include #include #define _AFXDLL using namespace std; vo原创 2013-06-19 12:33:17 · 6330 阅读 · 1 评论 -
C++模板的编译问题
对于模板,包括模板类与模板函数,它们的代码其实并不是直接翻译成二进制代码,它要求有一个“具体化”的过程,举个例子:template void FunA(T t){}int main(){FunA(10); // call FunA(int) 编译器在这里决定给FunA一个FunA(int)的具体实现体。}也就是说,如果在main函数中,没有调用过FunA原创 2013-06-16 22:07:44 · 1194 阅读 · 0 评论 -
C++ 容器 综合应用 文本查询程序
我们的程序将读取用户指定的任意文本文件,然后允许用户从该文件中查找文件。查询的结果是该单词出现的次数,并列出每次出现所在的行。如果某个单词在同一行中多次出现,程序将只显示改行一次。#include#include#include#include#include#include#includeusing namespace std;class TextQuery {原创 2013-04-01 23:09:52 · 999 阅读 · 0 评论 -
typeid().name() 返回值
它的输出是个字符指针,C++没有规定固定格式,我用的C-Free格式如下:它的输出格式为 [指针][名称空间][类别][模板][指针]:若是指针则输出P。[名称空间]:若是std则输出St,若是自定义的名称空间则输出字符数及它的名字,并在开头加N,在结尾加E。[类别]:若是自定义的名称空间则输出字符数及它的名字,若内建类型输出如下: bool:原创 2013-05-27 12:06:34 · 12734 阅读 · 1 评论