
C++ 语法特性
文章平均质量分 70
Pfirsich Zhang
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
sort函数在什么情况下可以使用
sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。在运用sort函数前,需要引用库<algorithm>,即在开头加上。原创 2024-10-11 21:41:48 · 315 阅读 · 0 评论 -
指针和迭代器的区别
本质是封装了原生指针,是指针概念的一种提升,提供了比指针更高级的行为,相当于一种智能指针,它可以根据不同的数据结构来实现不同的++,–等操作;迭代器是一种高级别的、抽象的数据访问接口,它隐藏了容器内部数据的具体实现细节,提供了一种统一的方式来遍历容器中的元素。指针的使用可能导致一些常见的错误,如空指针访问、越界访问等。迭代器通常提供了更多的安全保证,例如在边界检查、空容器检查等方面做了更多的工作,从而降低了出错的可能性。,表现的像指针,实际上他只是模拟了指针的一些功能,通过重载指针的一些操作符:->、原创 2024-10-11 21:10:03 · 359 阅读 · 0 评论 -
const是怎么实现的?
因为结构体类型不是内置数据类型,编译器不知道如何直接替换,因此必须要访问内存去取数据,而访问内存去取数据必然会取到被指针q改变后的值,因此会造成与C++中const int类型完全不一样的处理模式。问题2,C++语言中 const struct test的元素j通过指针q被改变了,为何const int 与 const struct test的反应机制不同?而在C++中,通过指针p修改了值后,i仍然是10。,当通过指针p改变该内存中的值后,再获取i的值的时候,会访问该空间,得到的是被改变后的值。原创 2024-10-11 21:02:05 · 342 阅读 · 0 评论 -
C++如何把基类指针转换为子类指针&强制类型转换
在C++中,可以使用 dynamic_cast运算符将基类指针转换为子类指针。dynamic_cast是一种安全的转换方式,它会在运行时检查转换是否合法。需要注意的是,。此外dynamic_cast只能用于类型的转换,。如果转换成功,dynamic_cast将返回指向派生类对象的指针;如果转换失败,dynamic_cast将返回空指针(nullptr)。因此,在进行dynamic_cast转换后,最好使用条件语句来检查转换的结果,以避免使用空指针进行操作。原创 2024-10-11 13:39:14 · 1098 阅读 · 0 评论 -
push_back(std::move(string))与emplace_back(string)
移动(Move)操作则是将一个对象的资源转移到另一个对象,这通常只涉及到修改指针或其他简单的内部状态,而不是复制整个数据,因此比复制要快。如果你想要添加一个已经存在的对象,并且想要避免复制,那么使用push_back(std::move(string))是合适的。构造(Construct)操作直接在预分配的内存空间中创建对象,通常是最高效的,因为它避免了不必要的内存分配和数据复制。复制(Copy)操作会创建对象的一个完整副本,这涉及到分配新的内存和复制现有对象的数据,这是三者中最耗费资源的操作。原创 2024-09-23 14:48:25 · 350 阅读 · 0 评论 -
指针和引用;内联函数和普通函数
指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。可以有const指针,常量指针可以改变指向,指针常量不能改变指向,也可以有const引用,引用的指向不能改变;指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;指针的值在初始化后可以改变,即指向其它的存储单元。原创 2024-09-19 13:02:49 · 446 阅读 · 0 评论 -
static关键字修饰全局变量、成员变量、局部变量的区别
static实际修改了局部变量的存储类型,将原本应该存储在栈区的局部变量存储在静态区。静态区上数据存储的特点是,程序结束变量才被释放。我们常见的全局变量就是存储在静态区上。栈区上数据的特点是入栈创建出栈销毁,所以说局部变量的作用域仅在相应。在编译阶段会被添加到符号表中,在链接阶段对其进行解析和符号重定位。生命周期:生命周期没变,因为全局变量任然存储在静态区上。生命周期:生命周期变长,程序结束生命周期才结束。作用域:作用域不变,只是出作用域不被销毁。作用:改变了全局变量的链接属性。,因为出代码块时被销毁。原创 2024-09-19 11:17:11 · 506 阅读 · 0 评论 -
嵌套/双层循环中的continue和break详解
大部分直到在一层循环中continue和break的作用,其作用为:continue:跳过这次循环,直接开始下一次循环break:直接结束循环但在嵌套循环中,却不清楚这两的作用范围。原创 2024-09-15 11:04:24 · 750 阅读 · 0 评论 -
裸指针是什么?unique_ptr的实现?shared_ptr的陷阱
unique_ptr删除了拷贝构造和赋值运算,加入了移动构造和移动赋值,解决了资源归属的问题,同时拥有自己的默认删除器,可以通过其来判断是调用删除一个对象的析构函数还是调用删除一组对象的析构函数。当使用explicit修饰构造函数时,它将。explicit是C++中的一个关键字,3. shared_ptr使用陷阱。由类型直接定义的指针。原创 2024-09-14 18:22:50 · 726 阅读 · 0 评论 -
Smart Point智能指针
C++11中通过引入智能指针的概念使得程序员不需要手动释放内存。原创 2024-06-24 22:57:15 · 179 阅读 · 0 评论 -
Call_once
call_once和once_flag的声明。原创 2024-06-26 16:37:53 · 214 阅读 · 0 评论 -
友元函数&友元类
" 友元函数 " 的 声明 , 不受类的访问控制限制 , 可以在任何地方定义 , 如 : 在 private: , protected: , public: , 下声明 友元函数 , 并不影响到 友元函数 的使用;只要 声明了 " 友元函数 " , 不管在什么位置声明 , 都可以正常通过该友元函数 访问 类中的成员;a.首先是类function的声明【只有声明了类function才能进行定义友元函数】友元类与友元函数类似,可以将一个类声明为另外一个类的友元类。类给予友元函数特别的访问权限。原创 2024-06-24 14:12:20 · 427 阅读 · 0 评论 -
C++ string类用法
参考。原创 2024-05-21 14:44:09 · 746 阅读 · 0 评论 -
C/C++全局变量、局部变量、静态变量和常量
(2) 允许对构造类静态局部量赋初值 ,例如数组,若未赋以初值,则由系统自动赋以0值。(而非静态局部变量未赋初始值,系统会给个随机值)(3) 对基本类型的静态局部变量,若在说明时未赋以初值,则系统自动赋予0值。而对自动变量没有赋初值,则其值是随机值。静态局部变量是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了上次被调用后留下的值。因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。原创 2024-06-26 16:10:09 · 670 阅读 · 0 评论 -
move&万能引用&完美转发
引用。原创 2024-07-01 23:46:28 · 825 阅读 · 0 评论 -
C++ lambda表达式:[](){}
引自。原创 2024-06-24 23:28:57 · 1206 阅读 · 0 评论 -
结构体struct和类class
结构名 结构变量名//创建一个student结构体//属性名//名字//班级//成绩//实例化方法1//用Student这个结构体创建了stu变量,stu拥有Student的所有属性//间接初始化//实例化方法2//直接初始化return 0;类用于创建用户定义的数据类型,可以包含数据成员和成员函数,以实现数据的封装和操作。类是面向对象编程的核心,允许将数据和操作封装在一起,以创建更加模块化和可维护的代码。private:public:// 类的成员函数。原创 2024-05-14 12:39:20 · 1158 阅读 · 1 评论 -
C++中的?
这个语句由 3 个子表达式组成,使用?如果条件x < 0是真的,则执行y = 10语句;否则,执行z = 20。所以当x=-1时,x < 0?y = 10 : z = 20的最终结果为y=10。条件运算符强大而独特,它提供了一种表达简单 if-else 语句的简写方法。和 : 单独使用没有特殊含义,合起来用时可以表示。例如:x < 0?:三目运算符一定要用于赋值语句。原创 2024-05-15 15:45:34 · 1433 阅读 · 0 评论 -
swap()和reverse()
1.1 功能标准库中的swap()函数可以交换任何数据类型的值,包括int,float,string等,甚至数据结构,如数组,堆栈和队列等。原创 2024-05-17 22:35:59 · 181 阅读 · 0 评论 -
vector<pair<char, char>>
功能:pair将一对值组合成一个值,这一对值可以具有不同的数据类型(T1和T2),两个值可以分别用pair的两个公有函数first和second访问。类模板:template struct pair。参数:T1是第一个值得数据类型,T2是第二个值的数据类型。map会对插入的元素按键自动排序,而且不允许键重复。vector的这种用法不会自动排序,而且允许重复。由传递给它的两个实参生成一个新的pair对象。vector的这种用法有点类似于map。原创 2024-05-13 10:44:57 · 432 阅读 · 0 评论 -
INT_MAX 和 INT_MIN是什么?如何防止溢出?
INT_MAX表示一个 32 位符号整数所能够表示的最大值,也就是 2^31 − 1。而INT_MIN则表示最小的负整数。这个值是相对于二进制补码表示法的,也就是说,负数的范围比正数大 1。:这些宏仅适用于 32 位整型变量,如果使用 64 位整型变量,需要使用其他预定义宏,如 LONG_LONG_MAX 和 LONG_LONG_MIN,代表能够存储的最大/最小长整数。是个很大的数,如果想得到数组中最小值,可以先将 min1。INT_MAX 和 INT_MIN 是 C++ 的两个。设成 INX_MAX。原创 2024-05-15 15:40:07 · 1012 阅读 · 0 评论 -
const用法详解
实参中,指针会指向一段内存地址,调用函数之后,函数会产生一个临时指针变量,这个变量的地址与实参的地址不一样,但是这两个指针指向的内存是同一块。如果函数作为输出用,不论是什么数据类型,也不论采用指针传递还是引用传递,都不能加const 修饰,否则参数会失去输出功能。在这个函数定义中,我们的的参数strsource加上const修饰,就是为了防止strsource被修改。习惯性的使用const,可以避免在函数中对某些不应修改的变量造成可能的改动。当为指针常量时,指针常量的值不可以修改,就是。原创 2024-05-13 21:28:45 · 543 阅读 · 0 评论 -
【C/C++】字符或字符串长度及所占内存大小的求法
在上述代码中,将字符串内容的大小计算为字符串中字符的个数乘以每个字符的大小(sizeof(char)),然后将结果打印出来。但是对于 std::string 类型的字符串对象,sizeof 运算符返回的是字符串对象本身的大小,而不是字符串内容所占的实际内存大小。std::string 类型的字符串对象会使用动态内存分配来管理字符串内容,所以实际的字符串内容所占内存的大小可能会比字符串对象本身的大小要大。由于字符数组的大小是根据字符串的长度自动确定的,加上终止字符的大小,所以结果为6。原创 2024-08-19 13:03:10 · 866 阅读 · 0 评论 -
new和malloc
malloc开辟一块int类型大小的内存并赋值为20。new开辟一块int类型大小的内存并赋值为20。new开辟一块有20个整数的数组内存,并赋初值0。malloc开辟一块有20个整数的数组内存。原创 2024-07-25 16:42:39 · 194 阅读 · 0 评论 -
nullptr和NULL
nullptr 既不是整型类型,也不是指针类型,nullptr 的类型是 std::nullptr_t(空指针类型),能转换成任意的指针类型。函数重载:C++允许在同一作用域中声明多个类似的同名函数,这些同名函数的形参列表(参数个数,类型,顺序)必须不同。而用nullptr,编译器则会选择 foo(char* s)的函数,因为nullptr不是整数类型。编译上述代码,结果如下图所示,编译器提示有两个函数都可能匹配,产生二义性。NULL是被定义为0的常量,当遇到函数重载时,就会出现问题。原创 2024-07-07 22:21:56 · 336 阅读 · 0 评论 -
C++ 宏
C++中的宏是一种代码片段,可以被宏的值所替换 ( 查找替换(文本替换) )。原创 2024-07-08 10:49:05 · 188 阅读 · 0 评论 -
typedef std::function与bind,placeholder
创建了一个名为 fun_t的类型别名,该别名表示一个接受两个整数参数并返回一个 int 的函数类型。: 这部分定义了 func1类型别名所代表的函数类型的签名。具体来说,它是一个接受两个整数参数并返回一个void的函数类型。它允许你为一个已存在的类型创建一个新的、易于使用的名称。myFunction 是一个函数类型别名的变量,可以用来调用一个接受两个整数参数并返回一个整数的函数。function: 这部分指定了要创建的类型别名的名称。这段代码是C++中用于。原创 2024-08-19 16:29:32 · 414 阅读 · 0 评论 -
初始化、初始化列表、成员类
对象成员必须使用初始化列表进行初始化,因为如果不在初始化列表当中对这个对象和进行初始化的话,那么Date类的构造函数会自动去调用_t 的默认构造函数来进行初始化,但是Time类没有默认构造函数,编译器就会报错引发未定义行为。所以。原创 2024-07-13 22:10:57 · 898 阅读 · 0 评论 -
自动推导、函数模板、类模板
函数模板是通用的函数描述,使用任意类型来描述函数。编译的时候,编译器推导实参的数据类型,根据实参的数据类型和函数模板,生成该类型的函数定义。生成函数定义的过程被称为实例化。返回值 函数名(T &a, T &b, ...){函数体T 是类型参数,代表类型。编译器由模板自动生成函数时,会用具体的类型名对模板中所有的类型参数进行替换,其他部分则原封不动地保留。同一个类型参数只能替换为同一种类型。编译器在编译到调用函数模板的语句时,会根据实参的类型判断该如何替换模板中的类型参数。T tmp=a;a=b;原创 2024-08-19 11:43:20 · 399 阅读 · 0 评论 -
for(auto &c:s)与for(auto c:s)
形如 for(auto c:s) 的格式,auto可以是别的数据类型比如char,int,const char*等等各类数据类型,可以是自定义的数据类型。c是一个变量名称,可以按变量名规则任意定义;s是一个容器名称,可以是一个数组,可以是string等等。for(auto c:s)中s为一个容器,效果是利用c遍历并获得s容器中的每一个值,但是。符号,可以对容器中的内容进行赋值,即。for(auto &c:s)中加了。原创 2024-05-13 21:47:41 · 324 阅读 · 0 评论