读书笔记

1.初始化器
string *pstr = new string( ) pstr指向空的string
auto p1 = new auto(obj) p1指向一个与obj类型相同的对象
auto p2 = new auto(a,b,c) 错误,初始化器中只能有一个对象
2.内存分配失败
int *p1 = new int;//如果分配失败,new抛出std::bad_alloc
int *p2 = new (nothrow) int;//如果分配失败,new返回一个空指针,我们称这种形式的new为定位new
3.坚持使用智能指针,就可以避免动态内存管理出现的问题
eg:shared_ptr p(new int(42)); 定义一个智能指针指向int=42的空间 ,初始引用值为1
process§;引用值加1,函数执行完毕后引用值减1
int i = *p;合法
4.指针类型的作用是什么?
为了明确指针寻址时到底要移动多少字节,值(地址)相同的指针指向变量的值可能不同
5.this指针深入理解
一个对象的this指针并不是对象本身的部分,不会影响sizeof的结果,this作用域是在内部,当类的非静态成员函数访问类的非静态成员时,编译器会自动将对象本身的地址(this)作为一个隐含参数传递给函数的第一个参数,也就是说,即便你没有写this指针,编译器在编译时也会为你加上,它作为非静态成员函数的隐含形参
eg:当我们调用SetNumber时:date.SetNumber(temp),但编译器转换的结果为SetNumber(&date,temp),将对象的地址传进参数,这样我们在函数内调用变量时就调用的是date对象的数据
6.赋值运算符重载还是拷贝构造?
当用一个非类A的值(如int型值)为类A的对象赋值时
①如果匹配的构造函数和赋值运算符重载函数同时存在,会调用赋值运算符重载函数。
②如果只有匹配的构造函数存在,就会调用这个构造函数。
7.什么时候需要提供赋值运算符重载函数?
①用非类A类型的值为类A的对象赋值时(当然,这种情况下我们可以不提供相应的赋值运算符重载函数而只提供相应的构造函数来完成任务)。
②当用类A类型的值为类A的对象赋值且类A的成员变量中含有指针时,为避免浅拷贝,必须显式提供赋值运算符重载函数。
8.深拷贝和浅拷贝
拷贝构造函数和赋值运算符重载函数都会涉及到这个问题。
所谓浅拷贝,就是说编译器提供的默认的拷贝构造函数和赋值运算符重载函数,仅仅是将对象a中各个数据成员的值拷贝给对象b中对应的数据成员(这里假设a、b为同一个类的两个对象,且用a拷贝出b或用a来给b赋值),而不做其它任何事。
当使用浅拷贝时,会出现两个变量指向同一地址,其中任意一个修改时,另外一个也会跟随修改;当然,当一个变量delet空间时,这段空间将归还给操作系统,另一个变量再次释放时,会造成程序崩溃(俗称Double free)
在这里插入图片描述
str2.name和str3.name共享此内存
①当我们通过str2修改它的name时,str3的name也会被修改!
②当执行str2和str3的析构函数时,会导致同一内存区域释放两次,程序崩溃!
这是万万不可行的,所以我们必须通过显式提供拷贝构造函数以避免这样的问题。先判断被拷贝者的name是否为空,若否,dalete name,然后,为name重新申请空间,再将拷贝者name中的数据拷贝到被拷贝者的name中。
在这里插入图片描述
9.赋值运算符重载函数只能是非静态的成员函数
C++规定,赋值运算符重载函数只能是类的非静态的成员函数,不能是静态成员函数,也不能是友元函数。
之所以不能是静态成员函数,是因为静态成员函数只能操作类的静态成员,不能操作非静态成员。如果我们将赋值运算符重载函数定义为静态成员函数,那么,该函数将无法操作类的非静态成员,这显然是不可行的。
学习资料
https://www.cnblogs.com/nihaoCPP/p/4303178.html c++知识
https://blog.csdn.net/yezitoo/article/details/78193794 网络知识

10.oracle数据库导入dmp文件问题
在导入dmp文件超过32G时需要增加表空间,具体步骤如下:
A.查询当前用户表空间

select tablespace_name, file_id, file_name,round(bytes/(1024*1024),0) total_space,
from dba_data_files  order by tablespace_name;

在这里插入图片描述
B.从表中可以得到用户名和路径,接下来可以在对应的用户下增加表空间

alter tablespace USERS add datafile 'D:\App\zhaiyangbin\oradata\orcl\USERS07.dbf' size 50m autoextend on next 50m maxsize 32767m;

增加表空间USERS07并且设置初始值为50,每次自增50,最大值为32G
C.现在就可以导入dmp文件了,如果dmp超过64G可以依次自增。

11.软链接
ln -s 源文件 目标文件
eg:ln -s old.txt ./new.txt
删除连接:unlink new.txt
12.linux下使用root用户无法改变文件或目录权限时,输入lsattr -a 命令,查看属性是否有a或i,如果有,使用chattr -i/-a删除属性,即可取消保护,反之,如果需要特殊保护某文件不被root用户和普通用户删除,即可使用chattr +i +文件名保护,+a属于保护不被外界访问
13.ldconfig命令
当使用ldconfig命令时,最好加-X选项,保证第三方库的软连接不被更改
14.qt 编译过程中遇到connot find -l***
到lib中查找所对应的库文件是否存在,如不存在则需要添加,如果pro文件中是-levent,lib中为libevent2.6.1.so,则需要建立软连接ln -s libevent2.6.1.so libevent.so ,qt在编译中便可以找到这个库
15.解决QT提示No previous extern declaration for non-static variable “***“
不规范写法,在1.cpp中声明int a ,在2.cpp中声明extern int a,这种写法编译器会报警告 No previous extern declaration for non-static variable a
正确写法:在1.h中声明extern int a ,然后在2.cpp中包含1.h即可,但必须在1.cpp中定义
如果int a只需要在1.cpp中使用,则在全局定义时需要加static 关键字
16.const引用传递的作用
在c++中当函数参数为引用时,如果传递的实参与函数参数类型不匹配,那么就要将参数类型定义为const,此时函数将会产生一个临时变量,临时变量自动转化为函数参数类型。否者将报错。如果传递的实参是一个临时变量,那么就要将函数参数定义为const类型。否则也会报错。即使为了代码易读,可以保证绝对不会出现字面值,有时也不得不用const引用传递。如果你写了个函数为了保护参数加了const,但函数里面调用了另一个参数没const的函数,那么这里估计就要出错,因为const实参不能传递给非const形参。虽然你能保证自己的代码不冲突,但不能保证别人的代码,尤其是合作的时候每人写一个部分。
17.引用传递可以避免截断问题
使用传值改为传引用能避免对象被截断问题 : 主要影响就在于多态的表现

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值