C++
文章平均质量分 51
SilentAssassin
If you wish for peace, prepare for war
展开
-
C++中protected访问权限问题
今天发现有这样两句话: 1. 基类的保护成员对于派生类的成员是可访问的。 2. 派生类的成员只能通过派生类对象访问基类的保护成员,派生类对一个基类对象中的受保护成员没有访问权限。这两句话看的太头晕了,其实作者应该是想表达:只有在派生类中才可以通过派生类对象访问基类的protected成员。看这样的代码:class Base{public: Base();private...原创 2018-07-19 17:17:10 · 20766 阅读 · 4 评论 -
函数在main之前或之后运行
C++中,全局对象的构造函数在main之前运行,析构函数在main之后运行。类静态变量的初始化在main之前,静态函数不行。class Base{public: Base() { std::cout<<"基类构造"<<endl; } ~Base() { std::cout<<...原创 2018-08-09 22:43:01 · 522 阅读 · 0 评论 -
结构体与类的字节对齐(终极方案,简单易懂)
字节对齐终于搞清楚结构体的字节对齐怎么计算了,看了那么多博客,好多都不靠谱,最后看了一个老外的讲解,没用3分钟就明白了。主要是两条规则: 1. 某个类型变量是否需要补位,取决于之前所有变量所占内存字节数是否是它的整数倍,若是则不必补位,不是则补齐。 2. 结构体总大小必须是最大成员变量大小的整数倍直接看几个例子: 1. typedef struct bb{ int id;...原创 2018-08-06 23:12:58 · 2427 阅读 · 4 评论 -
char数组和指针问题
这个问题是C++基础问题中相当折腾人的一个,死记硬背解决不了根本问题,记住还是要忘,需要仔细研究其本质。这两种方式就是数组和指针的方式:char a[6] = "abcde";char *b = "abcde";第一行声明了并初始化了一个char数组,第二行是声明char指针b,指向了常量字符串。其中a是数组的首地址,a和b的地址一定不同。千万不能说数组名是指针,可以用siz...原创 2018-08-30 19:45:33 · 3500 阅读 · 0 评论 -
不要显式调用构造函数和析构函数
常用的代码如下:Base b;cout<<"hello"<<endl;结果:基类构造 0x62fe84hello基类析构0x62fe84但是这样的代码就不同了:Base(); //匿名的临时对象cout<<"hello"<<endl;运行结果:基类构造 0x62fe84基类析构0x62fe...原创 2018-08-29 16:52:01 · 682 阅读 · 0 评论 -
strcat strcpy strlen strcmp
strcat我自己写的是这样:char* _strcat(char *_Dest, const char *_Source){ assert((_Dest != NULL) && (_Source != NULL)); char* p= _Dest; while(*p!='\0') { p++; } co...原创 2018-08-29 16:52:51 · 364 阅读 · 0 评论 -
memset和memcpy函数
memset函数原型:void *memset(void *s, int ch, size_t n); 作用:将s所指向的内存中的前n个字节的内容全部设置为ch指定的ASCII值,这个函数通常为新申请的内存做初始化工作。一般用于结构体和数组的初始化。memset中的第三个参数一定要使用sizeof操作符,因为每个系统下对类型长度的定义可能不一样。memset中的第一个参数一定要是一个...原创 2018-08-29 16:53:11 · 614 阅读 · 0 评论 -
静态变量和静态函数
对于类的静态成员变量,只有static const int类型和 enum 类型能在类里面初始化,其他只能在.cpp里初始化,但不能在类体内初始化,因为静态数据成员为类的各个对象共享,否则每次创建一个类的对象则静态数据成员都要被重新初始化。静态成员函数和静态变量在类体外初始化时,无须加static关键字,否则是错误的。静态变量不参与sizeof计算静态成员仍然遵循public,privat...原创 2018-08-29 16:59:32 · 653 阅读 · 0 评论 -
单例模式
应用实例: 1、日志类,一个应用往往只对应一个日志实例。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。3.windows系统的任务管理器就是一个例子,总是只有一个管理器的实例。优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。 2、避免对资源的多重占用...原创 2018-08-05 16:13:43 · 475 阅读 · 0 评论 -
详解拷贝构造函数
基本规则拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。所以类中可以存在多个拷贝构造函数。编译器会自动生成默认构造函数,这个构造函数很简单,仅仅使用“老对象”的数据成员的值对“新对象”的数据成员逐个进行赋值,也就是浅拷贝。默认拷贝构造函数不处理静态变量。如果静态成员变量在构造、析构实例的时候需要修改,那么通常需要手工实现拷贝构造函数和...原创 2018-08-04 14:19:41 · 1150 阅读 · 0 评论 -
构造函数的成员初始化列表问题
必须在派生类构造函数中初始化的几种情况派生类构造函数对基类初始化基类没有显式声明构造函数或者有一个无参数的构造函数,派生类构造函数可以不用对基类初始化,即忽略基类的构造函数,基类的构造函数全是有参数的,派生类必须至少实现一个基类的构造函数,例如Qt中常见的:explicit MainWindow(QWidget* parent=0);//QMainWindow构造函数都...原创 2018-08-04 10:12:15 · 1663 阅读 · 0 评论 -
使用sizeof计算联合体的大小
#include &lt;iostream&gt; using namespace std; union u{ double a ; int b ;};union u2{ char a[13] ; int b ;};union u3{ char a[13] ; char b ;};int main(){ ...转载 2018-07-25 10:52:13 · 340 阅读 · 0 评论 -
using关键字与派生类部分重写函数
使用class有时可能会遇到这种情况,基类中的函数func有多个重载版本,在派生类中对其中一个进行了重定义。通过派生类只能访问重定义的版本,如果派生类想通过自身类型使用基类所有的重载版本,则派生类要么重定义所有重载版本,要么一个也不重定义。如果基类中重载版本太多,在派生类中全重定义一遍太麻烦了。这就是using关键字适用的场合,可以在派生类中为重载成员名称提供 using 声明,使派生类使用的...原创 2018-07-15 09:56:26 · 380 阅读 · 0 评论 -
C++中类的成员初始化问题
子类进行构造函数之前,必须先运行父类构造函数。 子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法父类 没有写出构造函数或者有一个无参数的构造函数,子类构造函数可以不用对父类初始化,即忽略父类的构造函数,父类的构造函数全是有参数的,子类必须至少实现一个父类的构造函数,例如Qt中常见的:explicit MainWindow(QWidget* parent=0);...原创 2018-07-15 09:58:04 · 810 阅读 · 0 评论 -
C语言中的文件操作函数
平时用Qt的QFile用的习惯了,发现其实连C语言的文件操作函数都不熟悉,专门用C++写了个通讯录的命令行程序练手,总结一下用到的几个函数,使用这几个函数需要#include &lt;stdio.h&gt;。fopen和fclose函数 系统需要在内存中为每个读写的文件开辟一段缓存,缓存中保存文件信息的是FILE结构体,打开文件时就会获得指向FILE的指针。为什么要用缓存呢,因为硬盘...原创 2018-07-15 09:58:48 · 1212 阅读 · 0 评论 -
虚析构函数
假如一个类没有派生类,那么析构函数可以不是虚函数。如果有派生类,析构函数要声明为虚函数,这是为了防止新手犯错误。如果基类指针指向了派生类的对象,析构时,只会调用基类析构函数,没有派生类的析构函数。class Base{public: Base(){ } ~Base(){ // 应加上virtual声明 qDebug()<<"Base de...原创 2018-07-15 18:30:25 · 245 阅读 · 0 评论 -
再探默认构造函数
今天使用派生类时又发现了一个问题,基类和派生类的代码如下:class Base{public: Base(int a) { }};class Derived : public Base{public: Derived() { }};结果在编译时Derived类报错: error: no matching function fo...原创 2018-07-15 18:31:19 · 263 阅读 · 0 评论 -
静态绑定和动态绑定
对于非虚成员函数,C++是静态绑定的,而虚函数都是动态绑定,如此才可实现多态性。这也是C++语言和其它语言Java, Python的一个显著区别。几个名词定义: - 静态类型:对象在声明时采用的类型,在编译期既已确定; - 动态类型:通常是指一个指针或引用目前所指对象的类型,表现一个对象将会有什么行为,是在运行期决定的; - 静态绑定:绑定的是静态类型,所对应的函数或属性依赖于对象的静态...转载 2018-07-21 21:50:05 · 1183 阅读 · 0 评论 -
构造函数与析构函数
构造函数不能是虚函数。一般会报错inline”是构造函数的唯一合法存储类。类有一个指向虚函数表的指针用于调用虚函数,这个指针是在构造函数里初始化的,如果构造函数是虚函数,怎么在没有初始化的情况下调用它?构造函数中最好不要调用虚函数,某些编译器会报错。因为先运行基类构造函数,再运行派生类的。基类的构造函数时已经出现了虚函数表指针,它指向基类的虚函数表,所以基类的构造函数中调用的虚函数是基类的。E...原创 2018-08-03 21:27:24 · 341 阅读 · 0 评论 -
fprintf,snprintf和sprintf函数
fprintf原型:extern int fprintf (FILE *f,const char *s, ...); 可以将字符串输出到某文件中,但更常用的用法是:fprintf(stdout,"Hello\n"); //加换行fprintf(stderr,"World!");输出Hello换行World。stdout是行缓冲的,输出会放在一个buffer里面,只有到换行的...原创 2018-08-29 16:59:57 · 519 阅读 · 0 评论