先看代码 #include <iostream> #include <string> using namespace std; class Student { string name; int number; public: Student(const string &str, int n = 1) : name(str), number(n) {} Student() {} void Print(const Student &s); //期待的是Student类的参数 }; void Student::Print(const Student &s) { if (s.name == name) { cout << "same person" << endl; } else { cout << "di 继续阅读 >>


吕子健 18/04/01 11:50:07
c++里初始化静态、非静态,const以及引用的数据成员各不相同 静态成员初始化 class a { private: static int i1 = 1; //错误 static int i2; //应该这么做 static const int i3 =2; //正确 int i4 = 1; //正确 }; int a::i2 = 1; //在这里定义   总结一下,在类里面的静态数据成员,只有常量可以在类内定义,非常量的静态数据成员统一都在类内声明,类外定义   声明只是告诉编译器他的类型,定义时才分配内存空间   因为静态成员是类级别的,不是对象级别的,它的生存周期和源程序等同,为类所有的对象共享,所以如果在类里面就能定义分配内存空间,那么每一个对象被创建时都会分配一次内存,显然是不合理的,所以就放在类外,只分配一次内存空间   而至于常量静态数据成员,编译器知道他是一个常量,不会发生改变,所以可以在类内定义初始化   (小知识:一个变量只有可以拥 继续阅读 >>


吕子健 18/03/30 11:37:12
针对中国软件杯有关区块链的项目,记录一下了解学习的过程   官方说法区块链是:分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。      按照我的理解翻译一下   区块链就是一个使你不需要第三方信任凭证的数据结构.比如:在小组内,我现在和A赌球,他赌今年总冠军是火箭,我坚信湖人总冠军.我们赌了40,但是我们都信不过对方,于是交给中间人B.谁赢把钱给谁.但是也存在B(中心)卷钱跑了,所以我们有了区块链,不需要第三凭证人(中心),而是每一个人都是一个中心都有一个"账本",当我和A赌约成立后,小组内每个人的小账本上都记下了这个赌约,这样A就不能赖账了,以前他耍赖只需要贿赂B(中心),但现在他要改变小组内每一个人,所以当人群基数多起来后,基本是不肯能的,这就保障了区块链的信用可靠性.   所以说,区块链是我们每一个人都拥有一个按时间顺序关联成链记录交易(具体数据)的区块,通过一定的加密算法记录交易数据并使其不可逆      这样一来,我们的网络的服务器模型就是P2P模 继续阅读 >>


吕子健 18/03/20 22:25:33
例子如下: using namespace std; class test { public: void a() { while ( 1 ) signal( SIGINT, change ); } void change( int sag ) { cout << "here\n"; } }; int main() { test t; t.a(); } 这样会报错 error: invalid use of non-static member function 因为signal的函数原型: void (*signal(int signo , void (*func)(int)))(int); signo:表示需要处理的信号; func:是一个指向void funciont(int)类型的函数指针; 返回值:返回值是一个指向void function(in 继续阅读 >>


吕子健 18/03/12 20:03:58
在康康的帮助下找出了内存泄露 C++需要自己来管理内存,真的是很容易发生内存泄露啊,以后需要更加仔细认真 #include<iostream> #include<cstring> #include<cstdbool> using namespace std; class String { char *str; //输出 friend ostream& operator<<( ostream &,String & ); //输入 friend istream& operator>>( istream &,String & ); //初始化 String(); String( const char * ); String( const String & ); String( int ,char ); 继续阅读 >>


吕子健 17/12/26 21:39:44
#include<stdio.h> int a[100]; int n; void quicksort( int left,int right ); int main() { int i,j; scanf( "%d",&n ); for( i = 0;i < n;i++ ) { scanf( "%d",&a[i] ); //输入数据 } quicksort( 0,n-1 ); //快排 for( i = 0;i < n;i++ ) { printf( "%d ",a[i] ); } printf( "\n" ); return 0; } void quicksort( int left,int right ) { int i,j,t,tmp; if( left > right ) { re 继续阅读 >>


吕子健 17/12/20 21:51:45
以前一直觉得这两个有区别,但也没深究,今天写了个代码报了警告于是就看了看,总结如下。 例如如下代码: #include<iostream> using namespace std; int main() { char *p1 = "abcd"; char p2[] = "1234"; return 0; } 这二者的区别还在于: 1. p1是一个指针变量,有一块内存存储它,它的内容是字符串的地址,那么我们要访问字符串就先要取出p1中存储的地址,然后计算偏移量,进行访问 2. 不同于p1,p2直接是字符串的地址,直接访问就行了 “abcd”是文字常量区分配了内存存储的,栈上分配一地址给p1并指向“abcd”,那么如果在后面的代码中改变了“abcd”,自然崩溃。所以,需要加上const限定 但是说到底,为什么改变p1就是危险的,字符数组的内容就能随意改变呢?这是因为“abcd”是在编译时刻就确定的,而“1234”是在运行时刻赋值的。所以,编译器在编译 继续阅读 >>


吕子健 17/12/05 11:16:06
总结一下最近学到的类继承的知识,包括三种继承方式、多态的实现、动态联编和静态联编。 欢迎各位指正其中的错误。 以后的理解更加深刻了回来更新和修改。 三种继承 从一个类,派生出另一个类时,原始类称为基类(父类),继承类称为派生类(子类) 派生类对象存储了基类的数据成员,且可以使用基类的方法,但不能直接访问基类的私有成员,必须使用基类的公有方法进行访问。可以根据需要添加额外的成员 因为构造函数不能继承,那么 派生类在创建对象时先使用基类的构造函数初始化继承的基类的数据成员,再使用自己的构造函数( 类的构造函数可以为空,但必须存在 ) 例如: #include<iostream> using namespace std; class A { int x; public: A( int xx ) { x = xx; } void show() { cout << " A 继续阅读 >>


吕子健 17/11/19 20:59:52
今天在敲一段代码时编译正确,运行时却出现bug 先是显示如题目的提示,然后会出现一大堆系统错误信息,如图 当时一脸懵逼,只能看懂一句:invalid pointer(无效的指针) 所以经过排查,发现有两句代码写的有问题,delete了不是new出来的指针,改掉就好了 以后要注意,delete/delete[]和new/new[]一定是配套使用 作者:weixin_36888577 发表于 2017/11/14 22:22:14 原文链接 https://blog.csdn.net/weixin_36888577/article/details/78535912 阅读:222 继续阅读 >>


吕子健 17/11/14 22:22:14
Linux下不支持fflush刷新缓冲区,所以我们想到了setbuf函数,这随之而来的各种问题和小伙伴探讨之后得出如下结论 首先,网上有很多不同的言论,有的说setbuf只是刷新缓冲区,有的说会关闭缓冲区,众说纷纭,经过我们的测试和查找资料,如果你将stdin/stdout指向NULL,setbuf会关闭你的缓冲区,而不仅仅是刷新(查询度娘和man手册)。 例如:setbuf(stdin,NULL); 因为stdin相当于一股输入流,你把它指向空,那么就不仅仅是刷新了,他会关闭你的输入缓冲区,而从你的输入流里读数据。而输入流是行缓冲,但也会保存你的每一个字符(例如你的回车和空格,就像你的输入缓冲区有时候在cin的错误输入下,也会保存回车,如果你的输入流不存回车,那么他从哪里拿的回车呢?关于这个问题,具体大家可以看我的上一篇博客这里写链接内容 ) 综上所述,setbuf会将缓冲区更改为你指定的内存,而当你将stdin,stdout指向NULL,他会关闭 输入/输出缓冲区,而更改为从输入/输出流里 继续阅读 >>


吕子健 17/11/12 23:13:59