- 博客(62)
- 资源 (7)
- 收藏
- 关注
原创 如何定义一个只能在堆或者栈上生成的对象
在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。 静态建立一个类对象,是由编译器为对象在栈空间中分配内存,是通过直接移动栈顶指针,挪出适当的空间,然后在这片内存空间上调用构造函数形成一个栈对象。使用这种方法,直接调用类的构造函数。 动态建立类对象,是使用new运算符将对象建立在堆空间中。这个过程分为两步,第一
2017-03-31 00:03:00 624
原创 const的全面理解
一、 如何区分顶层const和底层const 指针如果添加const修饰符时有两种情况: 1 指向常量的指针:代表不能改变其指向内容的指针。声明时const可以放在类型名前后都可,拿int类型来说,声明时:const int和int const 是等价的。声明指向常量的指针也就是底层const,下面举一个例子:int num_a = 1; int const *p_a = &
2017-03-29 07:05:28 384
原创 模拟实现链栈
#include<stdio.h>#include<malloc.h>#include<CertExit.h>#include<assert.h>typedef int DataType;typedef struct node{ DataType data; struct node* pNext;}*PNode,Node;typedef struct linkStac
2017-03-28 22:53:10 372
原创 模拟实现顺序栈及其改进
基础班#include<iostream>#include<time.h>using namespace std;#define MAX 1024 typedef struct{ int data[MAX]; int top;}SeqStack;void InitStack(SeqStack *stack){ stack->top = -1;}bool
2017-03-28 22:52:29 227
原创 explicit用法详解
C++提供了关键字explicit,可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生。声明为explicit的构造函数不能在隐式转换中使用。C++中, 一个参数的构造函数(或者除了第一个参数外其余参数都有默认值的多参构造函数), 承担了两个角色。 1 是个构造器 ,2 是个默认且隐含的类型转换操作符。 所以, 有时候在我们写下如 AAA = XXX, 这样的代码, 且恰好XXX的类型正好
2017-03-28 07:38:48 1970
原创 c/c++常见面试题2
编写类String的构造函数、析构函数和赋值函数,已知类String的原型为:class String{ public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String & operator =(con
2017-03-27 20:01:33 307
原创 c/c++常考面试题
1.分析下面代码有什么问题?void test1(){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );} 字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界; 2.分析下面代码有什么问题?void test2(
2017-03-27 19:54:48 827
原创 成员函数的重载覆盖与隐藏
成员函数被重载的特征: 1.具有相同的作用域 2.函数民资相同 3.参数类型顺序或数目不同(包括const和非const参数) 4.virtual关键字可有可无 覆盖是指派生类重新实现(或者改写)了基类的成员函数,其特征是: 1.不同的作用域(分别位于基类和派生类中) 2.函数名称完全相同 3.参数列表完全相同 4.基类函数必须是虚函数
2017-03-27 06:54:44 452
原创 模拟String类
模拟String类#includeusing namespace std;class String{public: String(char *data="") { if (*data == '\0') { _data = new char[1]; *_data = '\0'; } else { _data = new char[strlen(d
2017-03-26 12:30:20 412
原创 关于拷贝构造隐式转换和return时优化的一些思考
关于拷贝构造隐式转换和return时优化的一些思考#includeusing namespace std;class A{public: A() { cout << "构造" << endl; } A(int n) { a = n; } A(A&a1) { a = a1.a;
2017-03-26 12:19:38 296
原创 模拟实现Vector高级版
总结一下实现Vector时遇到的问题:1.delete[]的时候总是报错,应当第一时间想到delete[]和new[]的匹配问题,可能由于自己太过自信,没有往那方面想,以至于浪费了好长时间调试代码2.遇到错误应当现检查逻辑问题,然后再调试,不要浪费时间在寻找错误上,用调试技巧寻找错误会事半功倍。3.关于数组下标问题,数组下标总是比数组大小少一个学到的知识:1.const &是专
2017-03-25 09:33:30 328
原创 虚函数表深度剖析
多态是C++中一种代码复用的手段,什么叫多态?简单点说,就是多种形态。那么C++中是怎样实现多态的呢? 在C++中,多态分为两种:静态多态与动态多态。静态多态是对象声明的类型是在编译时确定的,比如说函数重载,模板。动态多态是所指对象的类型是在运行时确定的。动态多态的实现是通过虚函数来完成的。我们可以通过基类的指针或引用来调用基类与子类的函数,这个过程就实现了多态。我们知道,多
2017-03-22 17:33:56 245
原创 厄米多项式
厄米多项式/*Hermite Polynomials(厄米多项式)是这样定义的1 ,n <= 0Hn(x)= 2x ,n = 12xHn-1(x) - 2(n-1)Hn-2(x) ,n >= 2*/#include <stdio.h> int hermite(int n, int x){
2017-03-21 23:17:17 3489
原创 判断输入的矩阵是否是单位矩阵
判断输入的矩阵是否是单位矩阵#include<iostream>using namespace std;#define N 3bool judge(int(*arr)[10]){ for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i == j
2017-03-21 23:15:51 2150
原创 超级标准形式打印杨辉三角
用非常标准的三角形打印杨辉三角,代码如下:#include<stdio.h>#define N 10int main(){ int arr[N][N] = { 0 }; for (int i = 0; i < N; i++) { for (int j = 0; j <N; j++) { if (j == 0 ||
2017-03-21 23:14:26 750
原创 c/c++const实现原理解析
抛出问题 下列代码输出的结果是什么?#include<stdio.h>#include<iostream>using namespace std;int main(){/*在c++下*/ const int a = 10; //a = 100;error int *p = (int*)(&a); *p = 100;//正确 cout << *p <<
2017-03-19 09:30:13 858
原创 MVC版汉诺塔-炫黑版
MVC设计模式设计汉诺塔动态的汉诺塔移动图像用一个二维数组表示#include<iostream>using namespace std;int arr[10][3] = { 0 };void show(int(*arr)[3]);//MVC中的Vvoid move(char X, char Y);//MVC中的Cvoid hanno(int n, char A, char B, char
2017-03-18 23:48:44 530
原创 mfc实现仿射和凯撒加密解密
核心代码如下://加密算法 char *encode(char *c_str, int a, int b, int n);//解密算法 char *decode(char *m_str, int a, int b, int n);//设置数组coprime为存放与n互素的元素 void setCoprime(int coprime[], int n);//获取value1,valu
2017-03-18 16:42:25 1172
原创 模拟实现库函数strstr
模拟实现库函数strstr 代码如下#include<stdio.h>const char* mystrstr(const char*src, const char *needle){ for (int i = 0; src[i] != '\0'; i++) { int temp = i; int j = 0; while (src
2017-03-17 18:33:53 456
原创 寻找数组中的单身狗(一)狗一入侵
从前有一个这样的数组,数组中的元素在成双作对,他们都快乐的生活在数组的乐园里,时光就这样悠悠的,不紧不慢的流逝着,突然有一天一声怪异的犬吠声打破了原本宁静的数组乐园,数组乐园中多了一只单身狗,数组们面对单身狗的入侵毫无反抗之力,这时他们想到了找英勇无畏的程序猿帮忙,找出这只单身狗,干掉他!!! 给定一个数组如下 int arr[]={1,1,2,2,3,3,4,4,5,6,6,7,7};
2017-03-16 21:01:11 533 1
原创 模拟实现strncpy与极简改进
模拟实现strncpy与极简改进 代码如下:#include<stdio.h>#include<string.h>#include<assert.h>char *mystrncpy(char *des, const char *src, size_t n){ assert(des != NULL); assert(src != NULL); size_t len =
2017-03-16 20:43:26 535
原创 计算一个数字的二进制中1的个数
计算一个数字的二进制中1的个数 法一int main(){ int n; cin >> n; int count = 0; while (n) { if (n & 1 == 1) { count++; } n = (n >> 1); } cout <<
2017-03-16 18:52:57 342
原创 模拟实现strcpy
#include#include#includechar *mystrcpy(char *des, const char *src)//加const保证源字符串不被改写{ assert(des != NULL);// assert(src != NULL); if (src == des) { return des; } char *s = des; while ((*d
2017-03-16 18:48:25 267
原创 寻找数组中的单身狗(二)狗二的传说
有一个数组,数组中的元素都是成对出现的,其中有两只单身狗藏身其中,你能找出他们么?#includeusing namespace std;void find_singledog(int arr[], int len, int *num1, int *num2){ int temp = 0; int count = 1; for (int i = 0; i < len; i++) {
2017-03-16 17:45:14 678
原创 密码学大数乘法
大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。一般情况下大数的存储是采用字符数组来存储,即将大数当作一个字符串来存储,而对其处理是按其处理规则在数组中模拟实现。 三 大数乘法。大数乘法,相对之前的加法和减法,难度有所提高,但是本质还是一样的。下面
2017-03-15 16:47:22 643
原创 计算2+22+222
#includeusing namespace std;int main(){ int sum = 0; int total = 0; int n; cin >> n; for (int i = 0; i < n; i++) { sum = sum * 10 + 2; total += sum; } cout << total << endl; system("pa
2017-03-14 22:36:17 956
原创 数字二进制位的奇偶位互换
#includeusing namespace std;int reverse(int n){ return ((n & 0x55555555) > 1);}int main(){ int n; cin >> n; int res=reverse(n); cout << res << endl; system("pause");}
2017-03-14 22:35:16 713
原创 易错题之前置++后置++
#includeusing namespace std;int main(){ int m = 5; if (m++ > 5) { cout << m << endl; } else cout << --m;//5 system("pause");}//由此又即兴忆起金山的一道笔试题#includeusing namespace std;int main(int
2017-03-14 21:22:50 812
原创 打印输入的内容并添加行号
#includeusing namespace std;int main(){ char c; int i = 0; bool flag = true; while ((c = getchar()) != EOF) { if (flag) { cout << i; flag = false; } if ('\n' == c) { flag =
2017-03-14 21:21:12 399
原创 c++对象中的易错题集-拷贝构造了多少次
#includeusing namespace std;static int i = 0;class Widget{public: Widget() { //cout << i++ << endl; } Widget(Widget &w) { (*this) = w; cout << i++ << endl; }};Widget f(Widget u){
2017-03-14 21:19:08 344
原创 判断输入的文字花括号是否匹配
#includeusing namespace std;int main(){ char c; int count = 0; while ((c = getchar()) != EOF) { if ('{' == c) { count++; } else if ('}' == c&&0!=count) { count--; } else if
2017-03-14 21:16:33 519
原创 c++对象中的易错题集-同名隐藏
易错题 #include using namespace std; class A { public: int _a; int b; A() { b = 4;//若是不同名则不屏蔽也不需要通过::访问 _a = 1; } void print() { cout _a << endl; } }; class B :public A {
2017-03-14 21:11:26 405
原创 c/c++编译预处理
(1)#include(2)#include"头文件名称"第一种形式一般用来包含开发环境提供的库头文件,它指示编译预处理器在开发环境中设定的路径中找所需的头文件。第二种形式一般用来包含自己写的头文件,它指示编译预处理器在当前工作目录中搜索头文件,如果找不到再到开发环境所设定的路径中找.#include是一个伪指令内部包含卫哨和外部包含卫哨为了避免同一个编译单元包含同
2017-03-13 22:16:34 677
原创 结构体那些不为菜鸟所知的秘密--位域
C结构体之位域(位段) 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名
2017-03-13 21:18:41 1401
原创 struct关键字及内存对齐详解
struct关键字空结构体有多大?struct student{}stu;cout<<sizeof(stu)<<endl;//在vc6.0下是1因为为需要一个字节来标记这里有个结构体,否则如果是0的话,定义下一个结构体的时候,会和空结构体公用一个地址,无法分别。结构体不能递归自包含定义,如下:struct A{ int i; B b;}struct B{
2017-03-13 20:26:32 856
原创 数组那些不为菜鸟所知的秘密(零)
1、数组名的本质数组名的本质相当于一个常量指针 如:int a[10] a<=>int *const a; int b[10][20] b<=>int (*const b)[20] 所以a[5]==*(a+5); b[8][9]==((b+8)+9)==*(b+8)[9]; 2、数组在函数中传参时会被降级为指针 3、数组大小int a[10]={0};int b[10]={1,2
2017-03-13 19:10:31 495 2
原创 函数编程时的优良习惯
优良的函数编程习惯: 1.使用断言检测函数参数的合法性 2.使用const提高函数的健壮性 3.全面思考提高代码的鲁棒性 4.return的良好习惯
2017-03-12 16:30:56 397
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人