C++
文章平均质量分 54
michellechouu
这个作者很懒,什么都没留下…
展开
-
[C++]static, virtual, const关键字
Static成员函数能声明为const吗?不能。static成员函数是类所有的,可以直接用类名访问,不属于任何一个对象,访问时不会带上this指针。但是const成员函数,访问时会添加一个隐式的const this*, 二者的用法是冲突矛盾的。static成员函数能声明为virtual吗?不能。静态成员函数对于每个类来说只有一份代码,没有多态绑定的必要性。为什么转载 2016-02-23 15:00:35 · 3749 阅读 · 0 评论 -
【C++】拷贝构造函数和赋值函数
#include using namespace std;class String {public: String() ; String(const String &other) ; ~String() ; String & operator = (const String &other) ;private: char *m_data; int val;};位拷贝和值拷转载 2015-08-05 15:36:22 · 597 阅读 · 0 评论 -
【C++】二维数组中的查找
一个二维数组,每一行右边的都比左边的大,每一列下面的都比上面的大。完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数先从一般的情况推导:例如要在下面的数组中查找71 2 8 92 4 9 124 7 10 136 8 11 15从最右上角的9开始,因为9 > 7, 根据这个二维数组的数字分布规律, 9是它所在的列里的第一个,也就是原创 2015-08-06 13:48:03 · 1600 阅读 · 0 评论 -
【C++, Java】C++模板和Java泛型之间有何不同?
许多人都认为模板template和泛型generic这两个概念是等价的,因为两者都允许我们按照List的样式编写代码。不过,各种语言是怎么实现该功能,以及为什么这么做,却千差万别。Java的泛型的实现根植于“类型消除”这一概念。当源代码被转换成Java虚拟机字节码时,这种技术会消除参数化类型。例如,假设有一下java 代码: Vector vector = new Vector()原创 2015-07-24 18:02:33 · 6810 阅读 · 0 评论 -
【C++】编写一个智能指针类。
编写一个智能指针类。智能指针是一个数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。它会自动记录SmartPointer对象的引用计数,一旦T类型对象的引用计数为0,就释放该对象。除了指针对象外,我们还需要一个引用计数的指针设定对象的值,并将引用计数计为1,需要一个构造函数新增对象还需要一个构造函数析构函数负责引用计数减少和释放内存通过覆写赋值运算符,原创 2015-07-24 13:47:59 · 1981 阅读 · 0 评论 -
【C++】用C编写一个my2DAlloc函数,可以分配二维数组。
用C编写一个my2DAlloc函数,可以分配二维数组。将malloc()的调用次数降到最少,并确保可以通过arr[i][j]访问该内存二维数组就是数组的数组,首先想到,先创建一个一维的指针数组,每个指针指向一个一位数组。如下:int** my2DAlloc(int rows, int cols) { int** rowptr; int i; rowptr = (int**)mallo原创 2015-07-24 14:39:34 · 710 阅读 · 0 评论 -
【C++】sizeof
定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,得到的结果是多少?答案是1。为什么?空类型的实例中不包含任何信息,本来sizeof的结果应该是0,但当我们声明该类型的实例时,它必须在内存中占有一定的空间,否则无法使用这些实例。至于占用多少内存,由编译器决定。VS中每个空类型的实例占用1字节的空间。如果在该类型中添加一个构造函数和析构函数,再对该类型求si原创 2015-08-03 23:22:30 · 371 阅读 · 0 评论 -
【C++】用C++写个方法,打印输入文件的最后K行
用C++写个方法,打印输入文件的最后K行使用循环数组#include using namespace std;void printLast10Lines(char* fileName) { const int k = 10; ifstream file(fileName); string L[k]; int size = 0; while( file.gooe() ) {原创 2015-07-23 15:53:27 · 624 阅读 · 0 评论 -
【C++】模板
模板是一种代码重用方式,不同的数据类型可以套用同一个类的的代码。比如,我们可能有列表类的数据结构,希望可以放进不同类型的数据,如下:#include using namespace std;template class ShiftedList { T* array; int offset, size;public: ShiftedList(int sz) : offset(原创 2015-07-23 15:29:30 · 355 阅读 · 0 评论 -
【C++】构造函数 析构函数 虚函数
C++中所有成员变量和方法都默认private,可以用关键字public修改属性。构造函数和析构函数对象创建时,会自动调用类的构造函数。如果没有定义构造函数,编译器会自动生成一个默认构造函数default constructor。另外,我们也可以自己定义构造函数。Person( int a) {id = a;}另外,类的数据成员还可以这样初始化:Person(int原创 2015-07-22 17:39:23 · 487 阅读 · 0 评论 -
【C++】C语言的关键字volatile有何作用?
C语言的关键字volatile有何作用?volatile的作用是指示编译器,即使代码不对变量做任何改动,该变量的值仍可能被外界修改。操作系统,硬件或其他线程都有可能修改该变量。该变量的值有可能遭受意料之外的修改,因此,每次使用时,编译器都会重新从内存中获取这个值。volatile变量不会被优化掉,这非常有用。volatile变量在多线程程序里也很有用。对于全局变量,任意线程原创 2015-07-23 17:00:53 · 392 阅读 · 0 评论 -
【C++】深拷贝和浅拷贝
浅拷贝会将对象所有成员的值拷贝到另一个对象里。深拷贝除了拷贝所有成员的值,还会进一步拷贝所有指针对象。/* * copy.cpp * * Created on: 2015?7?23? * Author: nanzhou */struct Test { char* ptr;};void shadow_copy (Test & src, Test & dest)原创 2015-07-23 16:53:01 · 366 阅读 · 0 评论 -
【数据结构】散列表
比较并对比散列表和STL map。 如果输入的数据量不大,可以选用哪些数据结构替代散列表?在散列表里,值的存放是通过将键传入散列函数实现的。值并不以排序后的顺序存放。此外,散列表以键值找出索引,进而找到存放值的地方,因此,插入或查找操作均摊后可以在O(1)时间内完成。(假定该散列表很少发生碰撞冲突)散列表还必须处理潜在的碰撞冲突,一般通过拉链法解决(chaining),也就是,创建原创 2015-07-23 16:23:10 · 626 阅读 · 0 评论 -
【Java】编写一个方法,将字符串中的空格全部替换为“ ”
编写一个方法,将字符串中的空格全部替换为“%20”,假定该字符串尾部有足够的空间存放新增字符,并且知道字符串的真实长度。因为java里字符串是不可变的,所以如果用java,用字符数组而不是字符串public class replaceSpaces { public void spacesReplace(char[] str, int length) { int spaceCount原创 2015-07-07 15:21:51 · 4483 阅读 · 0 评论 -
【C++】动态内存分配
动态内存分配(c中的malloc,c++中的new),得到的存储区属于内存中的堆。C/C++把内存分为了四个部分:1. 代码区2. 全局变量与静态变量区3. 局部变量区即栈区4. 动态存储区即堆区原创 2015-09-24 22:36:58 · 496 阅读 · 0 评论 -
【C++】调整数组顺序使奇数位于偶数前面
最简单的做法是,从头扫描数组,碰到一个偶数则把这个偶数拿出来,然后将这个偶数后面的数字都往前移动一位,移动完毕后在数组末尾有一个空位,这时把该偶数放入这个空位。这样做的时间复杂度是O(n2)。时间复杂度更低的办法有吗?有的。维护两个指针,一个位于数组开头,只往后移动,一个位于数组末尾,只往前移动。并且第一个指针总是位于第二个指针前面。如果第一个指针指向偶数,并且第二个指针指向奇数,就交换这原创 2015-09-11 15:40:15 · 1889 阅读 · 0 评论 -
【C++】赋值运算符函数
将已有的对象拷贝给另一个对象时,会用到赋值运算符函数, 尤其是当对象的内存分配在堆上时函数原型:ClassName & operator = (const ClassName &obj)#include using namespace std;class CMyString {public: CMyString(char* pData = NULL) ; CMyStr原创 2015-08-05 16:27:16 · 6396 阅读 · 0 评论 -
[C++]虚函数与纯虚函数
C++中,所有数据成员和方法均默认为私有,可用关键字public修改其属性。当我们无法或不想实现父类的某个方法时,可以将父类的该函数声明为虚函数,但是父类还是可以实现这个函数,这样做是为了允许基类的指针来调用子类的这个函数。而如果将父类的某个函数声明为纯虚函数,这个函数就不能被实现,用=0标记。且这个类就成了抽象类,不能被实例化。定义纯虚函数是为了起到一个规范作用,规定这个类的派生类必转载 2016-02-20 15:50:53 · 342 阅读 · 0 评论 -
[C++]类模板
C++中模板类的目的是为了将数据类型参数化,提高运行效率。模板的声明:templatetypename 数据类型参数1,...> class 类名 {//TODO;};其中,数据类型参数不能为空。一旦声明了模板类,就可以用数据类型参数来声明类中的成员变量和成员函数,也就是说,以前使用int,float等数据类型的地方,都可以用类型参数替代。模板的实例化实例化原创 2016-02-20 20:58:29 · 427 阅读 · 0 评论 -
[C++]vector,list和deque的区别
vector封装了数组,拥有一段连续的内存空间,并且起始地址不变。因此vector可以非常好地支持随机存取,支持[]操作符重载和vector.at()。但是由于它的内存空间是连续的,所以在vector中间进行插入和删除会造成内存块的拷贝和移动,复杂度是O(n)。 此外,当该数组的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝,这些都降低了vector的效率。但是在vector的原创 2016-02-20 19:26:03 · 514 阅读 · 0 评论 -
[C++]虚函数
1. 什么是虚指针?虚指针是一个虚函数的实现细节,带有虚函数的类中的每一个对象都有一个虚指针指向该类的虚函数表。2. 纯虚函数?有时在基类中将某一成员函数定为虚函数,并不是基类本身的要求,而是考虑到派生类的需要,在基类中预留了一个函数名,具体功能留给派生类根据需要去定义。纯虚函数是在声明虚函数时被“初始化”为0的函数。声明纯虚函数的一般形式是 virtual 函数原创 2015-09-13 17:31:24 · 322 阅读 · 0 评论 -
[C++]浅谈构造函数
什么是构造函数?构造函数是一种随着对象创建而自动被调用的函数,主要作用是对对象作初始化。C++中规定与类同名的成员函数就是构造函数。构造函数应该是一个公有的成员函数,并且构造函数没有返回值类型。构造函数可以如同一般函数一样被重载。在C++中,每个类都有且必须有构造函数,如果用户没有自行编写构造函数,编译器会提供一个无参的构造函数,称为默认构造函数。但这个默认构造函数不做任何初始原创 2016-02-20 13:49:42 · 431 阅读 · 0 评论 -
【C++】派生类构造函数
/* * ali1.cpp * * Created on: 2015年9月21日 * Author: nanzhou */#include class A{public: A():m_iVal(0) { test(); } virtual void func() { std::cout<<m_iVal<<' '; } void test() { f原创 2015-09-21 20:46:07 · 379 阅读 · 0 评论 -
【C++】合并两个排序的链表,要求合并后仍然是有序的
struct ListNode { int m_nKey; ListNode m_pNext;};ListNode* merge(ListNode* pHead1, ListNode* pHead2) { if (pHead1 == NULL) { return pHead2; } if(pHead2 == NULL) { return pHead1; } ListNo原创 2015-09-15 17:44:32 · 2393 阅读 · 0 评论 -
【C++】反转链表
struct ListNode { int m_nKey; ListNode m_pNext;};ListNode* ReverseList(ListNode* pHead) { ListNode* pReversedHead = NUll; ListNode* pNode= pHead; ListNode* pPrev = NULL; while(pNode != NULL)原创 2015-09-15 17:30:30 · 406 阅读 · 0 评论 -
[C++]虚函数的虚继承
下面的代码输出是多少?为什么?#include #include #include using namespace std;class A{ char k[3];public: virtual void aa() {};};class B : public virtual A{ char j[3]; //to see where is the vfptr in cl原创 2015-09-13 10:04:29 · 366 阅读 · 0 评论 -
【C++】返回单链表的第k个结点
返回单链表的第k个结点,双指针可以很好地解决这个问题:ListNode* FindKthToTail(ListNode* pListHead, unsigned k){ ListNode *pAhead = pListHead; ListNode *pBehind = NULL; for(unsigned int i = 0; i < k - 1; i++) { pAhead =原创 2015-09-11 16:47:56 · 982 阅读 · 1 评论 -
【C++】拷贝构造函数
#include using namespace std;class A{private: int value;public: A(int n) { value = n; } A(A other) { value = other.value; } void print() { cout << value; }};int _tmain( int argc, char* arg原创 2015-08-04 15:30:05 · 552 阅读 · 0 评论 -
【C++】打印1到最大的n位数
输入数字n,按顺序打印出从1到最大的n位十进制数。例如,输入3,则打印出1,2,3,到最大的三位数999。不能直接使用int或者long型,因为这样肯定会溢出,考虑用字符串来输出,将一个字符串先初始化为00。。000,然后实现加法。如何判断已经达到最大的n位了呢?可以每输出一次就与999.。。999比较,但这样未免太麻烦,时间复杂度为O(N)。如果是最大的n位数,那么这个999.。。9原创 2015-08-27 17:10:33 · 1491 阅读 · 0 评论 -
【c++】写一个函数,实现x的y次方
写一个函数,实现x的y次方乍一看会觉得很简单,一个for循环就搞定了double result = 1.0;for (int i = 1; i <= exponent; i++) { result *= base;}return result;但这样做,没有考虑到指数是负数的情况,也没有考虑到如果base是0,指数是负数没有数学意义的情况。稍加考虑我们可以写出下面的代码:原创 2015-08-21 13:30:33 · 13567 阅读 · 2 评论 -
位运算
原创 2014-05-21 13:46:20 · 313 阅读 · 0 评论 -
基本问题之操作符优先级
#include "stdafx.h"#include int _tmain(){unsigned char a = 0xA5;unsigned char b = ~a >> 4 + 1;//各操作符优先级, ~高于+高于>>, 所以是先取反,再加1, 然后右移5位// 先将a提升至int型, 编译为汇编语言后,a存在eax寄存器里, 由于eax寄存器是原创 2014-05-21 13:43:41 · 470 阅读 · 0 评论 -
sizeof 与 strlen的区别
1. sizeof的结果类型是size_t,在头文件中的typedef为unsigned int型, 表示0~MAX INT - 12. sizeof是运算符, strlen是函数3. sizeof可以用类型和函数做参数,用函数做参数时,值为函数返回值类型的大小。strlen只能用char*做参数,且必须是“\0”结尾的4. 数组做sizeof的参数不退化,做strlen的退化为指针原创 2014-05-21 12:49:19 · 328 阅读 · 0 评论 -
const的用法
原创 2014-05-21 14:30:44 · 390 阅读 · 0 评论 -
基本问题之类型转换后的指针寻址
注意:1. 将unsigned int转换为unsigned char时发生截断,由4个字节截断为1个字节。只保留最低的两位 也就是f7, 前面补0, i为000000f72. char *b = (char*)&a;&a的类型由a的类型决定,a是unsigned int, &a也就是unsigned int//也就是unsigned int *p = &a//于是发生了un原创 2014-05-21 13:36:50 · 432 阅读 · 0 评论 -
命名空间和string object的大小
原创 2014-05-21 15:51:31 · 335 阅读 · 0 评论 -
预处理#define
#define的语法:#define hong原创 2014-05-21 14:10:01 · 476 阅读 · 0 评论 -
求最大最小中间数的其他方法
原创 2014-05-21 13:49:45 · 670 阅读 · 0 评论 -
static用法
原创 2014-05-21 14:41:41 · 349 阅读 · 0 评论 -
break的fall through
原创 2014-05-21 13:55:41 · 398 阅读 · 0 评论