
C/C++
C/C++
IT_10-
我爱编程 编程爱我❤️
展开
-
从代理类走进句柄类(理解“引用计数”和“写时拷贝”是一波什么操作以及如何使用?)
1.代理类代理类是用来干什么的? 解决将继承体系中的对象放到同一个容器中的问题,这就必须解决两个子问题:1.编译时类型未知类型的绑定;2.合理的分配内存。 用交通工具类来举列子,现在有这样的一个类://交通工具类1class Vehicle {public: double weight() const; void start(); // ......};原创 2018-01-28 18:02:31 · 278 阅读 · 0 评论 -
菱形继承与虚拟菱形继承对象模型
菱形继承对象模型下面用一段菱形继承的代码来探究菱形继承的对象模型class AA{public: virtual void fun1() { cout << "AA::fun1()" << endl; }public: int _a;};class BB : public AA{public: virtual void fun1()原创 2017-02-17 16:12:57 · 496 阅读 · 0 评论 -
探究多态&虚表
多态 所谓多态,就是当使用基类的指针或引用调用重写的虚函数时,当指向父类调用的就是父类的虚函数,指向子类调用的就是子类的虚函数。 下面来通过代码来理解多态的含义class AA{public: virtual void fun() { cout << "AA::fun()" << endl; }};class BB : public AA{pub原创 2017-02-16 17:36:20 · 517 阅读 · 0 评论 -
菱形继承与菱形虚继承剖析
菱形继承定义为:两个子类继承同一个父类,而又有子类同时继承这两个父类。 为了方便理解,画出如下菱形继承的对象模型 代码描述如下:#include<iostream>using namespace std; class AA{public: int _a;};class BB : public AA{public: int _b;};class CC : public原创 2017-02-15 19:49:58 · 765 阅读 · 4 评论 -
比较复数的大小(用C++的类实现)
注:1.复数的大小是通过复数的模来比较的;2.对于复数类大小的比较,可以用对“>”运算符的重载来实现。#include<iostream>#include<cmath>using namespace std;class Complex{public: Complex(double real,char sign ,double imge) :_real(real)原创 2017-01-02 17:43:26 · 5421 阅读 · 0 评论 -
指针、数组指针、指针数组、指向指针的指针
**1.指针** 程序中一般通过变量名对变量进行存取操作,其实质是通过地址进行的。对变量的访问分为直接访问和间接访问,如语句“printf(“%d”,i);”,执行的时候,根据变量名 与地址的对应关系,找到i的地址,依次取相应的字节数中的数据(即i的值),把它输出。这种按照变量地址存取变量值的方式成为直接访问;还可以将变量i的地址存放在另一个变量中,假设该变量为i_pointer(在32原创 2016-08-02 10:37:39 · 797 阅读 · 0 评论 -
宏和函数的区别
1.宏 宏定义又称宏代替,宏替换,其声明方式为:#define name(parameter-list) stuff。其中,parameter-list(参数列表)是一个有逗号分隔的符号列表,它们可能出现在stuff中。必须注意的是,参数列表的左括号必须与name紧密相连,如果两者之间有任何空格存在,则参数列表会被解释为stuff的一部分。#define机制包括了一个规定,允许把参数替换到文本原创 2016-10-17 20:59:47 · 582 阅读 · 0 评论 -
如何测试电脑的大小端存储
1.定义大端存储:数据的高字节放在内存的底地址处,低字节放在高地址处; 小端存储:数据的高字节放在内存的高地址处,低字节放在低地址处。2.测试方法一(利用联合体的共用一块内存空间的特性)#include<stdio.h>#include<stdlib.h>int main(){ union Check { int i; char ch;原创 2016-11-12 20:01:15 · 641 阅读 · 0 评论 -
文件输入/输出
**1.fopen()函数** fopen()函数用来打开一个文件,其函数原型为:FILE *fopen( const char *filename, const char *mode );filename为文件名,mode为文件的操作类型,即fopen()函数的模式字符串。若文件打开成功,则函数的返回值为指向文件类型的指针,否则,返回NULL。 fopen()函数的模式字符串如下: "r原创 2016-09-17 20:55:23 · 362 阅读 · 0 评论 -
小项目之C注释转换为C++注释状态
首先来看如下C注释状态的测试用例:// 1.一般情况/* int i = 0; */// 2.换行问题/* int i = 0; */int j = 0;/* int i = 0; */int j = 0;// 3.匹配问题/*int i = 0;/*xxxxx*/// 4.多行注释问题/*int i=0;int j = 0;int k = 0;*/int k = 0;// 5.原创 2017-01-05 22:03:00 · 393 阅读 · 0 评论 -
最大公约数与最小公倍数的C语言实现
#include<stdio.h>#include<stdlib.h>int Divisor(int a, int b) //最大公约数{ if ((a <= 0) || (b <= 0)) return -1; int min; min = (a <= b) ? a : b; while (min) { if ((a%min原创 2016-09-19 21:16:42 · 504 阅读 · 0 评论 -
三子棋C语言实现(多种模式任你选)
头文件部分//game.h//'X':人的棋子//'0':电脑的棋子#ifndef __GAME_H__#define __GAME_H__#define _CRT_SECURE_NO_WARNINGS 1#define ROWS 3#define COLS 3enum OP{ EXIT, PLAY};enum FIRST{ FIRST_PLAYER=1,原创 2016-10-17 12:16:37 · 669 阅读 · 0 评论 -
C语言程序编译过程详解
编译程序: 我们知道,计算机只能识别0和1,而我们的程序代码使用高级语言编写的,所以,要想被计算机识别并按照我们的要求工作,就必须将其翻译成等价的0/1序列。当我们编写好程序后并发出指令,在没有语法错误等异常情况下,计算机便会自动地将我们的源代码一步一步地进行处理,最终得到0/1序列。 程序的编译过程可分为如下4个大的步骤: (1)预处理; (2)编译; (3)汇原创 2016-10-19 15:22:08 · 1284 阅读 · 0 评论 -
可变参数列表详解(内附求平均数和实现简单的printf)
在求平均数的时候,如果数字只要少数的几个,那么我们可以依次给函数传参。可是,如果数字很多怎么办,数字类型不同又怎么办?难道要写出每个实参对应的形参吗?C语言是非常聪明的,这时候就出现了可变参数列表。1.首先来了解一下stdarg宏 可变参数列表是通过宏来实现的,这些宏定义在stdarg.h头文件中。这个头文件申明了一个类型va_list和三个:va_start,va_arg,va_end。原创 2016-10-29 20:43:38 · 672 阅读 · 0 评论 -
常见的五种排序算法
1.直接插入排序//直接插入排序(从小到大)#include<stdio.h>#include<stdlib.h>void insertsort(int a[], int n){ int i, j, tmp; for (i = 1; i < n; i++) { tmp = a[i]; //记录下当前要插入的元素原创 2016-09-18 16:18:07 · 481 阅读 · 0 评论 -
静态与动态顺序表操作的C语言实现
1.操作静态顺序表#include<stdio.h>#include<stdlib.h>#define MAXSIZE 10//插入void InsertElem(int sqlist[], int *len, int i, int a){ int t; if ((i<1) || (i>*len+1) || (*len == MAXSIZE)) //超出删除范围 {原创 2016-09-26 14:18:58 · 746 阅读 · 0 评论 -
函数调用栈帧过程带图详解
这里,我们来研究如下代码的栈帧过程。为了初学者理解汇编指令,所以编译环境是在vc++6.0下#include<stdio.h>#include<stdlib.h>int sum(int _a,int _b){ int c=0; c=_a+_b; return c;}int main(){ int a=10; int b=20; int ret=原创 2016-10-31 22:29:29 · 8397 阅读 · 0 评论 -
内存使用问题应该注意这五点
* 在程序员的世界里,“内存”这个词被比作“雷区”,因为很多时候程序代码编译能通过,但是结果却不是我们想要的,或者编译的时候中断,这时候,我们便开始绞尽脑汁地调试,想尽各种办法,经过七七四十九天之后,突然眼前一亮,oh my god!居然是一个语句中内存使用错误。所以,与其花费那么多时间调试,还不如好好想想如何尽量少出现这种错误。下面,我总结了在内存使用时的常见错误。*1.对NU原创 2016-10-26 13:25:11 · 629 阅读 · 0 评论 -
实现strcat( )和strncat( )函数
1.实现strcat( )函数 strcat()是c/c++中的字符串连接函数,实现strcat()函数的思路为先将目标字符串的结束符'\0'替换成源字符串的首字符,然后依次替换。注意,这里我们在定义目标字符串的时候利用字符数组,并且确保字符数组的大小足够存储连接后的字符串,否则,会发生栈溢出的情况,若用指针方法定义字符串,也会发生类似的栈溢出情况。 下面为我的strcat()函数代码:原创 2016-07-31 12:57:52 · 776 阅读 · 0 评论 -
实现strcpy( )和strncpy( )函数
1.实现strcpy( )函数 strcpy()函数用于字符串的复制,我们知道,当用数组定义字符串是,是不能直接将数组名进行赋值的,因为“=”的必须是可修改的左值。现在,我们就来实现自己的strcpy()函数。并且,在此处,我将自己写的代码和库里面strcpy()函数的执行时间做比较,哈哈,发现还是库里面的高明。#include<stdio.h>#include<stdlib.h>#inc原创 2016-07-31 15:54:13 · 694 阅读 · 0 评论 -
实现memcpy( )和memmove( )函数
**1.实现memcpy()函数** memcpy()为字节拷贝函数,他能拷贝任意类型的数组,是根据内存中的二进制码依次进行拷贝的。由于字符串拷贝函数strcpy()的结束标志是0,假如我们现在有int arr1[] = { 4, 2, 3, 4 };int arr2[] = {1,3,4,6}; 利用strcpy((char )arr1, (char )arr2);则输出的不是1,3,4,6原创 2016-07-31 20:57:42 · 444 阅读 · 0 评论 -
定义成数组,声明成指针与定义成指针,声明成数组带图详解
在理解定义成数组,声明成指针与定义成指针,声明成数组之前,我们需要知道: (1)数组就是数组,指针就是指针,虽然在用法上相似,但是他们的实际意义完全是两回事。char arr[]="abcdef";char *p=arr;arr和p都可以通过指针的方式和下表的方式访问字符串”abcdef”;但是他们的意义却不一样。如图所示 (2)关于定义和申明的区别,即定义为变量分配了内存,而申明没有;定义只原创 2016-08-02 00:05:44 · 1661 阅读 · 0 评论 -
预定义符号简述
编译C程序步骤简述 编译一个C程序涉及很多步骤,可概述为第一步:预处理;第二步:编译;第三步:汇编;第四步:链接。其中,预处理又可分为宏替换、头文件包含、去注释、条件编译四个部分,该任务主要由C预处理器完成。下面,就来讲述预处理器定义的符号。预定义符号 预定义符号有__FILE__、__LINE__、__DATA__、__TIME__、__STDC__这五种。 __FILE__原创 2016-10-17 12:08:33 · 1241 阅读 · 0 评论 -
结合两个循环单链表的C语言实现
#include<stdio.h>#include<stdlib.h>typedef struct cnode{ int data; struct cnode *next;}CNode,*LinkList;//初始化void InitLinkList(LinkList *L){ *L = (LinkList)malloc(sizeof(CNode)); (*原创 2016-10-03 14:50:14 · 489 阅读 · 0 评论 -
栈(顺序栈,多栈共享技术,动态顺序栈,链栈)
1.顺序栈#include<stdio.h>#include<stdlib.h>#define StackSize 10//创建typedef struct SeqStack{ int elem[StackSize]; int top;//存放栈顶元素的下标 -1表示空栈}SeqStack;//初始化void InitStack(SeqStack *S){ S->原创 2016-10-04 15:28:44 · 599 阅读 · 0 评论 -
实现strcmp( )和strncmp( )函数
**1.实现strcmp()函数** strcmp()函数是字符串比较函数,注意,此处比较不是根据字符串的长度,而是ASCII码的大小,一旦遇到ASCII不同的字符,就能返回结果,当前者大于后者时,返回一个正数,当前者小于后者时,返回一个负数。只有当每个字符都相同时,返回0。 下面来实现我自己的strcmp()函数,有兴趣的朋友也可以按照我的博文:实原创 2016-07-31 17:13:33 · 1152 阅读 · 0 评论