首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++primer学习笔记(一)

假设p是指针,当delete p;时,后面一定要p=NULL将p指向空 cin cout cerr 都是iostream类型的对象。...cout操作数对象,将右操作数写到左操作数对象,"hello world"是右操作数,前面半句话的意思是将hello world...非const变量默认为extern。 引用初始化后始终绑定到初始化的对象,不能改变【引用本身不占存储单元】。...头文件用于声明,不是定义,因而可以出现多次。定义的语句不应该放在头文件里,出现两次会导致多重定义链接错误。例外是头文件可以定义类,还有值在编译时就已经知道的const对象,还有inline函数。...difference_type存储迭代器间距离。 设计良好的程序只有在强调速度时才在类实现的内部使用数组和指针。数组下标的正确类型是size_t。 预处理器变量NULL在编译时会被数值0替换。

50820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    左值和右值、左值引用与右值引用、移动语句(2)「建议收藏」

    术语rvalue右值指的是存储在存储器中某个地址的数据值。 rvalue是一个不能赋值的表达式。文字常量和变量都可以作为右值。当左值出现在需要右值的上下文中时,左值将隐式转换为右值。...只有C将函数指定符定义为具有函数类型的表达式。函数指示符不同于对象类型或左值。它可以是函数的名称或取消引用函数指针的结果。 C语言还区分它对函数指针和对象指针的处理。...以下表达式是xvalues: 调用返回类型为右值引用类型的函数的结果 强制转换为右值参考 通过xvalue表达式访问的非引用类型的非静态数据成员 指向成员访问表达式的指针,其中第一个操作数是xvalue...如果在编译器期望rvalue的情况下出现左值,则编译器将左值转换为右值。下表列出了此例外情况: 转换前的情况 产生的行为 左值是一种函数类型。 左值是一个数组。 左值的类型是不完整的类型。...如果允许绑定到非常量右值,则会导致非常危险的情况出现,因为非常量右值是一个临时对象,非常量左值引用可能会使用一个已经被销毁了的临时对象。

    2.6K20

    读完某C++神作,我只记下了100句话

    非const变量默认为extern。 引用初始化后始终绑定到初始化的对象,不能改变【引用本身不占存储单元】。...头文件用于声明,不是定义,因而可以出现多次。定义的语句不应该放在头文件里,出现两次会导致多重定义链接错误。例外是头文件可以定义类,还有值在编译时就已经知道的const对象,还有inline函数。...insert push可能导致迭代器失效,当编写循环将元素插入到vector deque时,必须更新迭代器。size()返回个数,empty()返回布尔值。...非引用形参将复制实参值,非引用return将复制return的东西。即使定义了其他构造函数,也会合成复制构造函数【能够复制类中的数组】。类成员有指针一般需要显示定义复制构造函数。...纯虚函数==抽象类==无法创建对象 派生类对象复制到基类时派生类对象将被切掉【而指针和引用不会】。

    1.4K20

    PHP虚拟机

    ‘literals’是出现在代码中字面值的数组,这个数组是CONST操作数引用。根据ABI①,每个CONST操作数要么储存指向次文本表的引用,要么存储相对于其开始的偏移量。...一种特定的临时类型往往具有特别长的活动范围:循环变量。...该catch抛弃异常,我们将尝试继续迭代已经死循环变量。 造成这个问题的原因是,当引发FE_FREE在try块内时,它是L11中FE_FREE的副本。从逻辑上讲,这是发生异常的地方。...这种相对不常见的情况是通过在产生控制时将调用帧复制到发生器结构中并在发生器恢复时恢复它们来处理。 这个设计自PHP 7.1起使用。...GET_OPn_ZVAL_PTR()是基本的操作数获取。它会在未定义的CV上发出通知,并且不会取消操作数的取消引用。

    2.3K10

    听GPT 讲Rust源代码--librarycoresrc(7)

    ptr模块中的函数和trait可以用于将裸指针转换为引用,或者将引用转换为裸指针。...这些值分别表示任务尚未完成、任务已完成并返回一个值、任务已完成但出现了错误。 Pending:表示任务尚未完成。当任务处于这个状态时,可以认为任务正在等待某些事件的发生。...escape::EscapeIterInner 是 EscapeDefault 结构体中的一个字段,它是一个迭代器适配器,用于将字节流转换为特定类型的迭代器。...这个范围用于指定从切片的开头(全范围)到指定索引之间的所有元素。...这样可以方便地将一个非转义的字符串转换为转义的格式,以满足某些需求,比如在字符串字面量中正确处理特殊字符。 Escape迭代器实际上是通过一个名为EscapeIterInner的结构体来实现的。

    20830

    C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)

    本文将深入探讨 C++11 中几个重要的特性,包括 引用、内联函数、auto 关键字、基于范围的 for 循环以及指针空值 nullptr。 博客主页:酷酷学!!! 感谢关注!!! 正文开始 一....类型转换和表达式传引用的注意事项 上篇我们讲过, 传引用时, 权限等于或者缩小, 但是权限不能放大 类型转换 如下面这个例子, 将浮点型数据赋值给整型变量, 在d赋值给i时, 需要借助临时变量, 用临时变量存储转换后的值..., 然后在赋值给i, 所以i的值是这个临时变量所赋给的, 而这个临时变量具有常性, 不可以修改, 所以涉及到权限的放大, 因此错误. // 权限可以平移/缩小 不能放大 double d = 12.34...使用引用可以直接访问对象,而不需要通过解引用符号(*)来获取指针所指向的对象。 引用可以避免指针操作中可能出现的空指针问题,减少了程序出错的概率。...指针空值nullptr(C++11) 1.C++98中的指针空值 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。

    11110

    STL四种智能指针

    (3)创建智能更高的指针,跟踪引用特定对象的智能指针数。这称为引用计数。例如,赋值时,计数将加1,而指针过期时,计数将减1,。当减为0时才调用delete。这是shared_ptr采用的策略。...2]都指向同一块内存,在释放空间时因为事先要判断引用计数值的大小因此不会出现多次删除一个对象的错误。...智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。...另外,如果按值而不是按引用给show()传递对象,for_each()将非法,因为这将导致使用一个来自vp的非临时unique_ptr初始化pi,而这是不允许的。...前面说过,编译器将发现错误使用unique_ptr的企图。

    2.7K41

    C++初阶

    ,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。...1.范围for的使用条件 1. for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供 begin和end的方法,begin和end就是for循环迭代的范围...this指针,只有非静态成员函数才有,且为隐藏指针 B.非静态成员函数的第一个参数就是隐藏的this指针 C.this指针在非静态的成员函数里面,对象不存在,故错误 D.单纯的对this赋空是不可以的,...出现模板编译错误时,错误信息非常凌乱,不易定位错误 知识点总结(易遗漏): 临时对象具有常性 函数返回的值具有常性 隐式类型转换也有常性,因为转换的过程,需要创建临时变量 全特化和偏特化和仿函数在...如果空间足够,不扩容时,迭代器不一定失效,比如push_back尾插,元素插入到空间末尾,在不扩容时不会对迭代器产生影响 C.vector删除,当前元素肯定失效,后面元素会牵扯到移动数据,因此删除元素后面的迭代器也会失效

    10210

    C++初阶大全

    ,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的,尤其是当参数或者返回值类型非常大时,效率就更低。...1.范围for的使用条件 1. for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供 begin和end的方法,begin和end就是for循环迭代的范围...this指针,只有非静态成员函数才有,且为隐藏指针 B.非静态成员函数的第一个参数就是隐藏的this指针 C.this指针在非静态的成员函数里面,对象不存在,故错误 D.单纯的对this赋空是不可以的,...出现模板编译错误时,错误信息非常凌乱,不易定位错误 知识点总结(易遗漏): 临时对象具有常性 函数返回的值具有常性 隐式类型转换也有常性,因为转换的过程,需要创建临时变量 全特化和偏特化和仿函数在...如果空间足够,不扩容时,迭代器不一定失效,比如push_back尾插,元素插入到空间末尾,在不扩容时不会对迭代器产生影响 C.vector删除,当前元素肯定失效,后面元素会牵扯到移动数据,因此删除元素后面的迭代器也会失效

    5810

    C++智能指针

    也就是说对一个智能指针进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数。...引用计数是实现智能指针的一种通用方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。...2]都指向同一块内存,在释放空间时因为事先要判断引用计数值的大小因此不会出现多次删除一个对象的错误。...另外,如果按值而不是按引用给show()传递对象,for_each()将非法,因为这将导致使用一个来自vp的非临时unique_ptr初始化pi,而这是不允许的。...前面说过,编译器将发现错误使用unique_ptr的企图。

    3.5K30

    深入解析C++的auto自动类型推导

    = 2.0; // 编译错误,i为int,j为double 规则二:形式如auto&或auto*,表示定义引用或者指针 当定义变量时使用如auto&或auto*的类型修饰,表示定义的是一个引用类型或者指针类型...规则三:形式如auto&&,表示万能引用 当以auto&&的形式出现时,它表示的是万能引用而非右值引用,这时将视expr的类型分为两种情况,如果expr是个左值,那么它推导出来的结果是一个左值引用,这也是...定义小范围内的局部变量时 在小范围的局部代码中定义一个临时变量,对理解整体代码不会造成困扰的,比如: for (auto i = 1; i < size(); ++i) {} 或者是基于范围的for循环的代码...,如果我们要修改代码,就不用去修改相应的类型,比如我们将一种容器的类型改为另一种容器,迭代器的类型不需要修改,如: std::map m = { ... }; auto...>类型,因此编译器会拷贝m中的所有元素到临时对象,然后再让p引用到这些临时对象,每迭代一次,临时对象就被析构一次,这就导致了无故拷贝了那么多次对象和析构临时对象,效率上当然会大打折扣。

    37920

    一文掌握C++基本语法

    在下面将double赋给int别名的过程中,编译器会产生“临时变量”,将double d中整数部分赋给临时变量, 这个临时变量再将这个整数赋给另一个int类型的临时变量,最后int把临时变量赋给rd,也就是说...引用在定义时必须初始化,指针没有要求 2. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 3. 没有NULL引用,但有NULL指针 4....例如如果在.h和.cpp文件中分别声明和定义内联函数,那么在链接的时候就会出现错误:main.obj : error LNK2019: 无法解析的外部符号 "void __cdecl f(int)" (...基于范围的for循环(C++11) 9.1 范围for的语法 for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。...9.2 范围for的使用条件 1. for循环迭代的范围必须是确定的对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围

    1.8K10

    从基础入门到学穿C++(C++语法基础篇)【超详细】【一站式速通】

    ,临时变量具有常性,所以需要加上const 权限的缩小和放大规则:适用于引用和指针间。...引用在定义时必须初始化,指针没有要求 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体 在sizeof中含义不同**:引用结果为引用类型的大小**,但指针始终是地址空间...,所占字节个数为32/64个字节 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小 有多级指针,但是没有多级引用 访问实体方式不同,指针需要显式解引用,引用编译器自己处理 内联函数 以inline...) { cout << e <<" "; } return 0; } for循环后的括号由冒号分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围...范围for的使用场景 使用范围for要提供精确的范围对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围(底层基于迭代器实现

    82110

    开启C++之旅(下):引用、内联函数及现代特性(auto和范围for循环)

    ,并且这些临时变量通常具有常量性质,那就需要用常引用 加了const就好了 在 C++ 中进行类型转换时,通常会创建一个临时变量来存储转换后的结果。...,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用。...用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& 在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错...for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围 基于范围的for循环会依次将容器中的元素赋值给迭代变量(通常命名为element)。...不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦* 所以我们使用nullptr来对指针进行初始化,来替代NULL,以免NULL定义为0时出现错误 注意: 在使用nullptr表示指针空值时

    25210

    【C++】vector的模拟实现(SGI版本)

    并且对于vector来说,由于它的底层是由顺序表实现的,所以它的迭代器就是原生态指针T*,我们定义了const和非const的迭代器,便于const和非const对象的迭代器的调用。...vector(size_t n, const T& val = T())//引用和指针在赋值时,有可能出现权限问题。这里需要用常量引用,否则无法接收常量值。...无论是从代码可读性还是实用性的角度来讲,现代写法都更胜一筹,这里利用形参对象v的迭代器来构造临时对象tmp,然后将对象tmp和* this进行交换,为了防止对象tmp离开函数栈帧销毁时造成野指针的访问问题...//所以一定要小心对于野指针的使用,如果it指向的旧空间被分配给某些十分关键的金融数据,则野指针访问会修改这些关键数据,非常危险 //如果野指针的使用影响到其他的进程就完蛋了,公司里出现这样的问题直接废球了...,那么一旦出现对象数组的拷贝构造时,reserve里面的memcpy就会造成野指针问题。

    56930

    【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值

    有多级指针,但是没有多级引用 访问实体方式不同,指针需要显示解引用,引用编译器自己处理 引用比指针使用起来相对更安全 二、内敛函数 2.1 内敛函数概念 内敛函数是以关键字inline修饰的函数,编译时...for循环(C++) 3.1 范围for语法 对于一个有范围的集合而言,交给程序员来说明循环范围是多余的,可能还会导致犯错误。...for循环后的括号由冒号:分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围 void TestFor() { int array[] = { 1, 2, 3, 4, 5 }...for的使用条件 1.for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围;对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围。...; } 迭代的对象需要要实现++和==的操作(本质还是迭代器) 四、指针空值 在C/C+良好的编程习惯中,对于未初始化的指针,一个没有合法的指向的指针,基本会进行初始化。

    11910

    【C++】C++入门

    汇编解释函数返回时利用临时变量 汇编解释函数返回时利用寄存器 寄存器其实也是需要拷贝的,先将局部变量的值拷贝到寄存器,然后再把寄存器的值拷到接收函数返回变量。...const int& ri = d;//这里引用的实体其实就是从double d 到int类型转换中间的临时变量 cout 引用实际上就是double到int...p2是个指针,因为它看到*的存在了,所以它认为const修饰的是p2指向的内容,不是p2本身 出现分析问题错误的原因,其实就是我们思考的是替换之后的结果,编译器在分析语法时,只会看到代码本身,根本不存在替换不替换这么一说...C++11中引入了基于范围的for循环,for后面的括号中有两部分组成,第一部分是在范围内用于迭代的变量,第二部分表示迭代的范围。...void TestFor() { int array[] = { 1, 2, 3, 4, 5 }; for(auto& e : array)//将迭代变量搞成引用,这样可以直接操作数组中的数据。

    2.9K30

    【c++入门】引用详解 | auto的类型推导 | 范围for循环 | nullptr空指针

    ☁️传值与传引用效率比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的...,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。...因此C++11中引入了基于范围的for循环。 for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围。...☁️使用条件 ⭐for循环迭代的范围必须是确定的 对于数组而言,就是数组中第一个元素和最后一个元素的范围; 对于类而言,应该提供begin和end的方法,begin和end就是for循环迭代的范围...,给大家详细讲解 ️指针空值(nullptr) 在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现 不可预料的错误,比如未初始化的指针。

    24910
    领券