- 博客(42)
- 收藏
- 关注
原创 C++之友元函数和友元类
一、友元函数和友元类1.1为什么要使用友元函数 在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。 实际上具体大概有下面两种情况需要使用友元函数:
2017-10-10 14:39:45
291
原创 C++之全局函数与成员函数的转换
一、全局函数和成员函数1、把全局函数转化成成员函数,通过this指针隐藏左操作数Test add(Test &t1, Test &t2)===》Test add(Test &t2)2、把成员函数转换成全局函数,多了一个参数void printAB()===》void printAB(Test *pthis)3、函数返回元素和返回引用Test& add(Test &t
2017-10-10 14:38:24
1404
原创 C++之对象的动态创建和释放
////程序分析#include #include // malloc 和 free:它们本身不是C语言的语法的一部分,是库函数提供的 函数// new 和 delete: 它们本身是C++语言的一部分,是 运算符 不是 函数// 创建普通类型变量int main12_1(){ int *p1 = (int *)malloc(sizeof(int)); free(p1);
2017-09-20 19:33:39
406
原创 C++之静态成员变量和静态成员函数
一、静态成员变量1)关键字 static 可以用于说明一个类的成员, 静态成员提供了一个同类对象的共享机制 2)把一个类的成员说明为 static 时,这个类无论有多少个对象被创建,这些对象共享这个 static 成员 3)静态成员局部于类,它不是对象成员,在类的外部进行初始化二、静态成员函数1)静态成员函数数冠以关键字static2)静态成员函数
2017-09-20 19:31:36
274
原创 C++之构造函数和析构函数的调用顺序
1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同;之后调用自身类的构造函数2)析构函数的调用顺序与对应的构造函数调用顺序相反#include class Test9_1{public: Test9_1 (int a) { m_a = a; printf ("9_1 1111111111111111111构造函数....a: %d\
2017-09-20 19:27:39
320
原创 C++之 深拷贝和浅拷贝
#include #include using namespace std; class Name{public: Name(const char *p) { m_len = strlen(p); m_p = (char *)malloc(m_len + 1); } ~Name() { co
2017-09-20 19:24:34
328
原创 对象的构造与析构(2) 构造函数规则
1)当类中没有定义任何一个构造函数时,c++编译器会提供默认无参构造函数和默认拷贝构造函数2)当类中定义了拷贝构造函数时,c++编译器不会提供无参数构造函数3)当类中定义了任意的非拷贝构造函数(即:当类中提供了有参构造函数或无参构造函数),c++编译器不会提供默认无参构造函数4 )默认拷贝构造函数成员变量简单赋值总结:只要你写了构造函数,那么你必须用。 构造析构阶段性总结
2017-09-20 19:22:03
297
原创 C++对象的构造和析构
一、构造函数1、声明:1)C++中的类可以定义与类名相同的特殊成员函数,这种与类名相同的成员函数叫做构造函数;语法:ClassName()2)构造函数在定义时可以有参数;3)没有任何返回类型的声明。 2、调用自动调用:一般情况下C++编译器会自动调用构造函数手动调用:在一些情况下则需要手工调用构造函数二、析构函数1、声明:1)C++中的类可以定义
2017-09-20 17:24:32
341
原创 类的声明与类的实现分开 点和圆
设计一个圆形类(AdvCircle),和一个点类(Point),计算点在圆内部还是圆外即:求点和圆的关系(圆内和圆外)point.h#ifndef __POINT_H__#define __POINT_H__class Point{public: // 设置点的坐标 void setXY(int x, int y); int getX(); int getY();
2017-09-18 17:30:59
596
原创 C++之类的封装
A)封装,是面向对象程序设计最基本的特性。把数据(属性)和函数(操作)合成一个整体,这在计算机世界中是用类与对象实现的。B)封装,把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 备注:有2层含义(把属性和方法进行封装 对属性和方法进行访问控制) C++中类的封装成员变量,C++中用于表示类属性的变量成
2017-09-18 17:25:29
618
原创 C++对C的函数扩展
一、内联函数#include #define MAX(a, b) f((a) > (b) ? (a) : (b)) void f (int max){ printf ("max = %d\n", max);}// 内联函数代替宏函数// 在普通函数前加 关键字 inline 将函数变成内联函数// inline 必须要和函数定义放一起,如果和函数声明放一起会被忽
2017-09-18 14:42:17
478
原创 C++中const和C++的引用
一、C++与C语言中const的比较1、C语言中#include int main(){ // C语言中 const修饰的变量是一个 常变量,本质还是变量,有自己的地址空间 const int a = 10; int *p = (int *)&a; *p = 5; printf ("%d\n", a); return 0;}
2017-09-18 14:24:46
439
原创 C++对C的加强
一、命名空间1、为什么要引入命名空间一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过,没有问题时,将它们结合到一起就有可能会出现命名冲突。 例如小李和小韩都参与了一个文件管理系统的开发,它们都定义了一个全局变量 fp,用来指明当前打开的文件,将他们的代码整合在一起编译时,很明显编译器会提示 fp 重复定义
2017-09-16 10:31:22
312
原创 条件变量
假设有这样一种情况:线程正在等待共享数据内某个条件出现,这时必须先解锁,否则其他线程不可能更改共享数据。一种实现方式是,可以循环检测共享数据,但是在检测前要加锁,检测后又要解锁,这样效率会很低。 因此,在这种情况下,需要一种方法,使得当线程在等待某些条件的满足时进入睡眠状态,一旦条件满足,线程就应该被唤醒继续执行。这个方法就是使用POSIX条件变量。 1、初始化PO
2017-08-17 10:39:24
280
原创 生产者/消费者模型改进版 ——队列
上述消费者/生产者模型比较简单,缓冲区中只能容纳一条消息。生产者每提交一条消息到缓冲区中,就会通知消费者,等消费者取走消息之后才能提交下一条消息。同样,消费者也必须等待生产者提交一条消息后才能进行处理。这种设计的效率是比较低下的。 如果将缓冲区设计为一个先进先出的队列,可以同时容纳多条消息,那么只要缓冲区不满,生产者就可以提交消息;同时,只要缓冲区不空,消费者就可以取出消息进行处理。这将
2017-08-17 10:37:26
419
原创 生产者/消费者模型
多线程并发应用程序有一个经典的模型,即生产者/消费者模型。系统中,产生消息的是生产者,处理消息的是消费者,消费者和生产者通过一个缓冲区进行消息传递。生产者产生消息后提交到缓冲区,然后通知消费者可以从中取出消息进行处理。消费者处理完信息后,通知生产者可以继续提供消息。 要实现这个模型,关键在于消费者和生产者这两个线程进行同步。也就是说:只有缓冲区中有消息时,消费者才能够提取消息
2017-08-17 10:34:45
269
原创 多线程程序设计
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属于一个进程的其他的线程共享进程拥有的全部资源。 Linux进程创建一个新线程时,线程将拥有自己的栈(因为线程有自己的局部变量),但与它的创建者共享全局变量、文件描述符、信号句柄和当
2017-08-17 10:23:38
252
原创 卖票系统
#include #include #include #include #include #include typedef struct _shm{ int flag; int ticket;}SHM;void sellTicket(SHM* pshm){ while (1) { int time = rand() % 10 + 1; usleep(t
2017-08-14 17:14:35
335
原创 共享内存的实现
共享内存实现分两个步骤:1、创建共享内存,使用shmget函数2、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。shmget:int shmget(key_t key, int size, int shmflg) key:1、0/IPC_PRIVATE:当key的取值为IPC_PRIVATE,则函数shmget()将创建一块新
2017-08-14 10:32:17
446
原创 命名管道的创建和使用
命名管道(FIFO)和无名管道基本相同,但也有不同点:无名管道只能由父子进程使用;但是通过命名管道,不相关的进程也能交换数据。#include #include int mkfifo(const char *pathname, mode_t mode); pathname: FIFO文件名mode:属性(同文件操作) 一旦创建了一个FIFO,就可用op
2017-08-14 10:30:19
1255
原创 父子进程通过管道实现文件复制
利用管道实现文件复制:1、父程序读端关闭,写端先将文件数据写入管道;2、子程序将写端关闭,然后从管道里读文件数据。#include #include #include #include #include #include #define SIZE 1024// 子进程通过管道从父进程接收数据void child_do(int *fd){ //关闭管道写端 cl
2017-08-14 09:34:31
734
原创 守护进程
同样我们需要了解一下什么是守护进程,守护进程就是在后台运行,不与任何终端关联的进程,通常情况下守护进程在系统启动时就在运行,它们以root用户或者其他特殊用户(apache和postfix)运行,并能处理一些系统级的任务.习惯上守护进程的名字通常以d结尾(sshd),但这些不是必须的.下面介绍一下创建守护进程的步骤:· 调用fork(),创建新进程,它会是将来的守护进程. ·
2017-08-11 20:58:02
279
原创 通讯录
/*******************************************************************需求:制作一个电子通讯录,通过该通讯录能录入好友ID号、姓名(英文)、手机号码,家庭住址,公司电话。模块:主界面:主要显示软件功能,A)添加好友信息 B)列表好友信息。(包含排序功能) C)搜索好友 D)删除好友A)用户输入INSERT命令
2017-08-10 16:31:51
399
原创 text1 + text2 =text3
手动创建两个文本文件text1.txt,text2.txt,要求编程创建text3.txt,实现text1.txt和text2.txt文件中除去首行和末尾对应的数据相加,三个文本的内容如下#include #define SIZE 10int main(){ FILE *fp1 = fopen("text1.txt","ab+"); if(fp1 == NUL
2017-08-08 15:00:40
741
原创 快速排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-07 09:02:24
219
原创 归并排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-07 09:01:47
191
原创 堆排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-07 09:00:57
191
原创 插入排序 二分插入排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-07 09:00:27
334
原创 选择排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-07 08:59:03
173
原创 冒泡排序 鸡尾酒排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-07 08:57:15
295
原创 希尔排序
#include // 交换函数void swap (int a[], int i, int j){int tmp = a[i];a[i] = a[j];a[j] = tmp;}// 打印数组void printA (int *a, int len){int i;for (i = 0; i {printf ("%4d", a[
2017-08-03 21:13:54
224
原创 计算器
#include #include #include #define MAX 100#define PUSH 0#define PUSH_NO 1typedef struct {int num[MAX];int top;}Num;typedef struct{char str[MAX];int top;}ch
2017-07-27 20:54:53
257
翻译 顺序栈的基本用法
#ifndef __ERROR_H__#define __ERROR_H__#include #define ERROR -1#define FULL_STACK -2#define EMPTY_STACK -3int errno; // 错误号void myError(char *str);
2017-07-26 22:53:09
323
原创 顺序表函数
#include "SeqList.h"#include #include SeqList *Create_List(){// 创建一个顺序表SeqList* s = (SeqList*)malloc(sizeof(SeqList)/sizeof(char));if (s == NULL){return NULL;}// 初始化顺序的成员
2017-07-23 22:37:11
560
翻译 一道约瑟夫的题目
/* * 约瑟夫环的再学习 * 有n个人围成一圈,从第一个人开始进行1~m的报数,报到m的人退出, * 问最后留下来的那个是第几个人。 * */#includeint main(){int arr[1000];int n,m;int i,p=0,q;printf("请输入人数:");scanf("%d",&n);printf("请
2017-07-21 23:19:13
250
原创 找合法帧 QAQ
输入一个字符串,同时输入帧头和帧尾(可以是多个字符),将该字符串中合法的帧识别出来.提示:帧头和帧尾分别是head和tail 字符串”asdheadhauboisoktail”中headhauboisoktail是合法帧#include #include // 在字符串str中寻找字符串sub,如果找到返回从sub开始的字符串char
2017-07-20 22:44:44
266
原创 C语言函数
话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。则:babaabbabbabbbb
2017-07-18 20:28:59
305
原创 编写一个C函数,将”I am from shanghai ”倒置为”shanghai from am I”,及将句子中的单词位置倒置,而不改变单词内部结构.
/*****************************************************copyright (C), 2014-2015, Lighting Studio. Co., Ltd. File name:Author:Jerey_Jobs Version:0.1 Date: Description:Funcion List:
2017-07-17 19:28:59
375
原创 strcmp(str1,str2)函数用法
#include #include int main (){char str1[100] = "asd";char str2[] = "asd";char *p1 = str1;char *p2 = str2;while (1){if(*(p1++) != *(p2++)){break;}if (*p1 == '\0' &&
2017-07-16 22:30:01
5941
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人