c++
文章平均质量分 77
weixin_45743453
这个作者很懒,什么都没留下…
展开
-
C++中的深、浅拷贝
我们将上面的string类进行改进,加上我们自己定义的拷贝构造函数。原创 2023-02-12 13:04:12 · 159 阅读 · 0 评论 -
STL中的string类
string类是basic_string模板类的一个实例,虽然大多数时候我们使用的string类型都是用char来实例化basic_string模板类,并用char_traits和allocator作为basic_string的默认参数,但是考虑到。的问题,除了char还有wchar_t(两字节)、char16_t、char32_t等,所以string也只是basic_string模板类的一个实例。string在底层实际是basic_string模板类的别名。string类对象的遍历。原创 2023-02-11 20:41:20 · 185 阅读 · 0 评论 -
C++中的函数模板和类模板
模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。原创 2023-02-10 21:52:13 · 187 阅读 · 0 评论 -
定位new表达式
定位new表达式在实际中一般是配合内存池使用**。因为内存池分配出的内存没有初始化,所以如果是自定义类型的对象,需要使用new的定义表达式进行显示调构造函数进行初始化new (place_address) type或者new (place_address) type(initializer-list)析构函数是可以显式调用的。原创 2023-02-10 19:30:37 · 198 阅读 · 0 评论 -
operator new与operator delete函数
operator new/delete就是对malloc和free的封装,operator new中调用malloc申请内存,失败的话就会抛出异常,这样符合c++面向对象的错误处理方式。原创 2023-02-10 19:11:35 · 125 阅读 · 0 评论 -
C++的内存管理方式new/delete
new/delete和malloc/free不要混着用,一定要匹配new和delete会调用构造函数和析构函数new失败之后会抛异常delete和delete[]也是不一样的,如果new的时候使用的是new[] 那么delete就要使用delete[],如果使用delete就只会调用一次析构函数从而导致错误,即便是new[1],也要使用delete[],而不是delete如果一个自定义类型的类中没有默认构造函数,那么使用new的时候就会报错,除非在使用new的时候就给初始值,这也是可以的。原创 2023-02-10 17:23:35 · 140 阅读 · 1 评论 -
C/C++的内存分布
注意字符串数组和常量字符串的区别栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信堆用于程序运行时动态内存分配,堆是可以上增长的数据段–存储全局数据和静态数据代码段–可执行的代码/只读常量。原创 2023-02-10 15:25:06 · 44 阅读 · 0 评论 -
详解C++赋值重载函数
构造函数和析构函数的处理机制基本是一样的拷贝构造和负值重载函数的处理机制基本是一样的用户没有显式实现赋值重载时,编译器会生成一个默认赋值运算符重载,以值的方式逐字节拷贝(也就是浅拷贝) ,对于内置类型成员变量是字节序的值拷贝,而自定义类型成员变量需要调用对应类的赋值运算符,其实这个和类的拷贝构造函数一样赋值运算符只能重载成类的成员函数不能重载成全局函数,赋值运算符如果不显式实现,编译器会生成一个默认的。原创 2023-02-08 15:12:48 · 402 阅读 · 1 评论 -
初识c++中的运算符重载
C++为了增强代码的可读性引入了运算符重载,运算符重载是具有特殊函数名的函数,也具有其返回值类型,函数名字以及参数列表,其返回值类型与参数列表与普通的函数类似函数名字为:关键字operator+需要重载的运算符符号。返回值类型 operator操作符(参数列表)例如:对于一个日期类型,我们想用"-“求两个对象之前的天数差值,但是会发现编译器报了下图这个错误,这是因为这个类使我们自己定义的,这个对象的类型不是内置类型,默认情况下c++是不支持自定义类型对象使用运算符。原创 2023-02-08 14:28:50 · 102 阅读 · 0 评论 -
详解C++中的拷贝构造函数
编译器默认生成的拷贝构造函数对内置类型和自定义类型都会处理默认的拷贝构造函数对象按内存存储按字节序完成拷贝,这种拷贝叫做浅拷贝,或者值拷贝类中如果没有涉及资源申请时,拷贝构造函数是否写都可以;一旦涉及到资源申请时,则拷贝构造函数是一定要写的,否则就是浅拷贝拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用为了提高程序效率,一般对象传参时,尽量使用引用类型,返回时根据实际场景,能用引用尽量使用引用。原创 2023-02-08 12:06:44 · 394 阅读 · 0 评论 -
详解C++中的析构函数
析构函数和构造函数类似,对于内置类型不做处理,对于自定义类型会去调用它的析构函数,因此如果我们不写析构函数,但是对象存在动态开辟空间的行为,并且我们想释放这块开辟的空间,那么就会造成内存泄漏但是仔细想一下,如果我们的对象成员变量中存在指针,但如果他是一个文件指针或者一个迭代器,那么我们就希望调用析构函数不会将其置空,所以析构函数到底释放哪些资源应该由我们自己决定。原创 2023-02-08 10:40:51 · 3727 阅读 · 0 评论 -
详解C++中的构造函数
C++编译器默认生成的构造函数设计得不好,它没有对内置类型和自定义类型统一处理,它不会处理内置类型成员变量,只处理自定义类型成员变量说白了就是,对象在定义使会调用构造函数,对于内置类型来说 有没有默认构造函数都可以,但是对于自定义类型来说,如果没有默认构造函数就会报错,不管这个默认构造函数是你自己定义的还是编译器自动生成的 如果你自己写了那么编译器就不会生成了,但是如果你写的构造函数一定需要参数才可以调用(也就是说他不是默认构造函数),那么编译器就会报错 而所谓的。原创 2023-02-07 22:56:45 · 1115 阅读 · 0 评论 -
详解C++中的nullptr(C++11)
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0在使用nullptr表示指针空值时,不需要包含头文件,因为nullptr是C++11作为新关键字引入的.在C++11中,sizeof(nullptr) 与 sizeof((void*)0)所占的字节数相同为了提高代码的健壮性,在后续表示指针空值时建议最好使用nullptr。原创 2023-02-07 18:17:49 · 608 阅读 · 1 评论 -
详解c++中的auto与范围for
使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto的实际类型。因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编译期会将auto替换为变量实际的类型用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。原创 2023-02-07 17:03:12 · 1267 阅读 · 0 评论 -
一篇文章带你看懂C++中的命名空间
在我们写c++项目的时候自己会定义许多的变量、函数和类,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,就上面的例子中,qz就是命名空间的名字 然后接一对{}即可,{}中即为命名空间的成员,可以是数据类型 结构体 类 函数…如果我们想要上面的M命名空间中的c,那么我们在访问的时候就。原创 2023-02-02 16:54:24 · 96 阅读 · 0 评论