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

第6章 函数

使用引用传递可以避免拷贝,效率较高;另外,有些类型(IO操作)不支持拷贝,只能通过引用形参访问该类型的对象。...尽量使用常量引用,表示该函数不会改变该形参。因为将函数定义成普通引用有以下缺点: 非常量引用只能接受非常量对象,不能把 const对象、字面值传递给这种形参。...在含有常量引用形参的函数中,无法将常量引用传递给非常量引用的函数,从而限制了后者的适用范围。此时需要使用 const_cast来转换底层 const属性。...---- 6.3 返回类型和 return语句 在含有 return语句的循环后面应该也有一条 return语句,对于该错误,编译器可能检测不到该错误(在我的 VS2015中,会警告,但不报错),则运行时该程序的行为将是未定义的...---- 6.4 函数重载 重载,几个函数名字相同但形参列表不同,在判断是否重载时,返回类型不予考虑。

1.3K70

听GPT 讲Rust源代码--compiler(26)

它包含了类型的大小、对齐要求、字段布局等。这个结构体是编译器在计算类型布局时使用的重要工具之一。 TyAbiInterface定义了一系列的trait,用于为不同的类型实现与ABI相关的操作。...FallbackToConstRef结构体是ConstToPat的一个辅助结构体。当无法生成常量的模式时,它将使用常量的引用作为模式。...这是因为某些类型的常量(例如大整数)很难生成模式来匹配,因此可以通过使用引用来处理。...临时变量是编译器在处理复杂表达式时使用的一种技术。由于一些表达式可能由多个子表达式组成,为了在计算这些子表达式时保持顺序和避免重复计算,编译器需要将结果保存在临时变量中。...函数首先检查表达式的类型,如果表达式的类型是一个引用类型,那么它会将引用的类型拆解并转化为临时变量。然后,函数会检查表达式是否是一个值,如果是的话,会直接返回表达式本身。

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

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

    const int& n = a+x = 临时对象; //支持权限相等 } 1.5 引用使用场景 1.5.1 引用作为输出型参数(减少拷贝,提高效率) 说明:如果参数是指针类型,使用时需要对其解引用操作...引用作为返回值类型,返回临时局部变量a被引用接收。那么对象ret接收到这块空间是什么?...这里需要根据编译器是否对这块函数栈帧清空,但是操作操作是不具备安全性 第二种情况,使用引用接收这块已经被回收的空间。...auto定义变量时必须对其进行初始化 return 0; } 打印变量类型:typeid(对象名).name() 3.4 auto使用(自动识别类型) auto定义变量 使用auto定义变量时必须对其进行初始化...在C++98中,字面常量0既可以是一个整型数字,也可以是无类型的指针(void *)常量,但是编译器默认情况下将其看成是一个整型常量,如果要将其按照指针方式来使用,必须强制类型转换。

    11910

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

    传值,传引用效率对比 以值作为参数或者返回值类型, 在传参和返回期间, 函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝, 因此用值作为参数或者返回值类型, 效率是非常低下的...类型转换和表达式传引用的注意事项 上篇我们讲过, 传引用时, 权限等于或者缩小, 但是权限不能放大 类型转换 如下面这个例子, 将浮点型数据赋值给整型变量, 在d赋值给i时, 需要借助临时变量, 用临时变量存储转换后的值...使用引用可以直接访问对象,而不需要通过解引用符号(*)来获取指针所指向的对象。 引用可以避免指针操作中可能出现的空指针问题,减少了程序出错的概率。...同样,缺少了初始化语句,编译器也可能会发出警告信息,但是这个声明本身是合法的。 在编程时,常常需要把表达式的值赋值给变量,这就要求在声明变量的时候清楚地知道表达式的类型。...在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)0。

    11110

    七、构造函数与析构函数

    ~MyClass()),它们是由编译器在对象生命周期结束时自动调用的。 如果类中有动态分配的资源,那么应该在析构函数中释放这些资源,以避免内存泄漏。...特点: 如果在类中未显式定义任何构造函数,编译器会自动生成一个无参的默认构造函数。 一旦用户显式定义了构造函数(无论是否有参数),编译器将不再自动生成默认构造函数。...形式:ClassName(const ClassName& other); 特点: 拷贝构造函数的参数是同类型对象的常量引用。...用途: 在处理临时对象或即将被销毁的对象时,使用移动构造函数可以避免资源的浪费。 总结:构造函数的分类主要基于其参数和用途。...在C++中,编译器提供的默认拷贝构造函数和拷贝赋值运算符通常执行浅拷贝。 深拷贝(Deep Copy) 深拷贝会创建一个新的内存区域来存储对象的成员变量值,特别是当成员变量是指针或引用类型时。

    13810

    C语言和C++的区别和联系

    面向对象:面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。...5、缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的参。...如果将它放出来,则会提出警告:将double类型转换成int类型可能会丢失数据。 这就意味着我们编译器针对下面两句调用都调用了参数类型int的compare。...只是我们在调用的时候有所不同:调用p时需要*p解引用,b则直接使用就可以。由此我们 推断出:引用在直接使用时是指针解引用。p直接使用则是它自己的地址。...new时不需要指定大小因为它可以从给出的类型判断,并且还可以同时赋初始值。 3)、malloc不安全,需要手动类型转换,new不需要类型转换。

    2.8K30

    C语言和C++的区别和联系

    面向对象:面向对象编程就是把问题分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在整个解决问题的步骤中的行为。...5、缺省参数 缺省参数是声明或定义函数时为函数的参数指定一个默认值。在调用该函数时,如果没有指定实参则采用该默认值,否则使用指定的参。...如果将它放出来,则会提出警告:将double类型转换成int类型可能会丢失数据。 这就意味着我们编译器针对下面两句调用都调用了参数类型int的compare。...只是我们在调用的时候有所不同:调用p时需要*p解引用,b则直接使用就可以。由此我们 推断出:引用在直接使用时是指针解引用。p直接使用则是它自己的地址。...new时不需要指定大小因为它可以从给出的类型判断,并且还可以同时赋初始值。 3)、malloc不安全,需要手动类型转换,new不需要类型转换。

    1.2K10

    《Effective Modren C++》 进阶学习(上)

    对于通用引用的推导,左值实参会被特殊对待 对于传值类型推导,实参如果具有常量性和易变性会被忽略 在模板类型推导时,数组或者函数实参会退化为指针,除非它们被用于初始化引用 2....为了对齐类型,编译器会创建一个临时对象,这个临时对象的类型是p想绑定到的对象的类型,即m中元素的类型,然后把p的引用绑定到这个临时对象上。在每个循环迭代结束时,临时对象将会销毁。...6. auto推导若非己愿,使用显式类型初始化惯用法 auto在推导时,可能返回的是引用类型,可能导致引用的对象被修改。因此在使用时,需要格外注意,可以通过显式初始化来规避此类问题。...Widget w1{}; // 正确,调用无参构造函数构造对象 「{}使用时的缺点」 上述描述了{}的种种优点,但其也存在一些缺点。...使用constexpr可以在编译时对常量表达式进行类型检查和错误检查。如果在常量表达式中使用了不允许的操作或无效的值,编译器会在编译时发出错误或警告,帮助我们及早发现并修复问题。 16.

    20320

    const 使用总结

    当程序员看到使用const修饰的代码时就知道不应该修改对应对象的值,而编译器则会强制实施这个约束,任何违反这个规定的代码会在编译期间报错。...可以使用常量实参或者非常量实参来初始化它都可以。可以根据形参中有没有const来区分函数是否重载:class Object {// ...}...);// 调用的是第一个函数fun(obj2);// 调用的是第二个函数上面的代码中,根据实参是否是常量对象来调用相应的函数,当使用常量实参调用fun函数时,只能匹配到const版本的那个函数,当使用非常量实参调用...对于形参是指针类型,也适用同样的规则。除了内置类型,对于用户自定义类型,建议使用const的引用传递参数,不要使用传值方式。...对于内置类型,还是建议使用传值方式,因为引用在底层一般是使用指针来实现,对于内置类型反而更浪费资源,而且编译器也可以做优化。对于自定义类型,一般情况下建议定义成const的引用,而不是普通的引用。

    13210

    【C++修行之道】引用、内联函数、auto关键字、for循环(C++)、nullptr(C++11)

    1.5 传值、传引用效率比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型...auto定义变量时必须对其进行初始化 return 0; } 【注意】 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型。...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编 译期会将auto替换为变量实际的类型 3.3 auto的使用细则 1. auto与指针和引用结合起来使用 用auto...在同一行定义多个变量 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译 器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。...在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器 默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *)

    6000

    【C++】C++入门知识详解(下)

    1.缺省值和缺省参数 缺省参数就是声明或定义函数时为函数的参数指定一个缺省参数。在调用该函数时,如果没有指定实参,则采用该形参的缺省值,否则,使用指定的参数。 有些地方把缺省参数也叫做默认参数。...这样C++函数调用就表现出了多态行为,使用更灵活。C语言是不支持同一作用域出现同名函数的。...当我们调用时给函数传参,就会自动调用有参数的那个函数,这个没问题 那当我们不给函数传参时,应该调用哪个呢?含缺省参数的函数无参也可以调用啊。...//这里a和b有没有const无所谓 const int a = 10; int b = 20; const int& rd = a + b; 因为表达式的结果会存在临时对象里面,临时对象就是编译器需要一个空间暂存表达式的求值结果时...,临时创建的一个未命名的对象,这个临时对象具有常属性。

    9410

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

    在调用该函数时,如果没有指定实参则采用该形参的缺省值,否则使用指定的实参。也就是说如果我们给定了参数就用我们传递的参数,如果没有给定,那么就使用默认值。...如果返回变量c是一个局部变量的时候,引用返回是不安全的 static修饰的变量会存储在数据段内,生命周期一直到整个函数结束 什么时候使用引用?...总结:一个函数要使用引用返回,返回变量出了这个函数的作用域还存在,就可以使用引用返回,否则就不安全 使用引用返回的好处:少创建一个拷贝的临时对象,可以提高函数的执行效率(并不是节省空间的占用) 引用和指针的区别...查看编译器生成的汇编代码中是否存在call Add 2.在debug模式下,需要对编译器进行设置,否则不会展开,因为debug模式下,编译器默认不会对代码进行优化,这里需要自己去设置 设置方式:配置 –...,因为NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。

    81710

    C++11『右值引用 ‖ 完美转发 ‖ 新增类功能 ‖ 可变参数模板』

    () 函数来说,也不应该只发生一次 移动构造,实际应该先把 ret 拷贝给 临时对象,再将 临时对象 中的资源转移;但编译器判断 ret 是一个局部变量,出了函数就销毁了,于是就优化成了 return...当传入的参数为 右值 时,推荐使用 右值引用 作为参数类型;如果既有传入 左值 也有传入 右值 的情况,可以重载一个 右值引用 参数版本,编译器会匹配最合适的版本,确保资源不被浪费 常见的 右值引用 作为参数类型的有...,就需要使用 forward 函数,也就是 完美转发 forward 是一个带有参数模板的函数,主要在传参时使用: 如果参数原本是右值,但在右值引用后失去了右值属性,使用 forward 函数可以恢复它的右值属性...移动语义是否能延长临时对象(将亡值)的生命周期?...,此时就可以使用 const 引用作为参数类型来延长临时对象的生命周期,伴随 push_back() 栈帧销毁而被销毁 注意不要认为 const 引用做返回值时能延长局部对象的生命周期,局部对象出了作用域就被销毁了

    54250

    《C++Primer》第六章 函数

    熟悉C语言的程序员常常使用指针类型的形参访问函数外部的对象,在C+++中建议使用引用类型的形参来替代指针。 2....传引用参数 使用引用避免拷贝:拷贝大的类类型对象或者容器对象比较低效,甚至有的类类型(包括IO类型在内)根本就不支持拷贝操作。当某种类型不支持拷贝操作时,函数只能通过引用形参访问该类型的对象。...由于string对象可能非常长,我们应该尽量避免直接拷贝它们,这时候使用引用传参也是比较明智的选择,比如const string &s1。...数组形参 数组拥有两个特殊性质: 不允许拷贝数组:意味着我们不能用值传递的方式使用数组 使用数组时会将其转换成指针:为函数传递一个数组时,本质上传递的是指向数组首元素的指针 下面这三个函数是等价的,编译器只会检查参数是否是...引用返回左值 函数的返回类型决定函数调用是否是左值,调用一个返回引用的函数得到左值,其他返回类型返回右值。 我们能为返回类型是非常量引用的函数的结果赋值。 4.

    74210

    QT(C++)面试总结

    (QString))); 但这样写,没有编译器检查,有时编译器通过但应该调用的槽函数没有执行。...这是编译器不能给出错误信息,只能在运行时看是否有警告。...3.引用 引用是一种特殊的指针。引用是一个指向其它对象的常量指针,它保存着所指对象的存储地址。并且使用的时候会自动解引用,而不需要像使用指针一样显式提领。...(2)const 常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。...进行上行转换(把子类的指针或引用转换成基类表示)是安全的; 进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

    2.1K10

    【C++】基础知识讲解(引用、内联、auto,基于范围for循环)

    类型& 引用变量名(对象名) = 引用实体; 特性 引用在定义时必须初始化 一个变量可以有多个引用 引用一旦引用一个实体,再不能引用其他实体 指针和引用的功能是类似的,重叠的。...函数传参需要传二级指针,这时就可以用引用来代替。 使用场景 作参数 引用可以作输出型参数(即改变形参就能改变实参)(如上图),在对象比较大的时候,可以减少拷贝,提高效率。...传值、传引用效率比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直 接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效 率是非常低下的...用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& 使用auto定义变量时必须对其进行初始化,在编译阶段编译器需要根据初始化表达式来推导auto 的实际类型...因此auto并非是一种“类型”的声明,而是一个类型声明时的“占位符”,编译器在编 译期会将auto替换为变量实际的类型 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译

    23610

    C++函数返回结果为自定义类型

    形参的类型决定了形参和实参交互的方式。 如果形参是引用类型,它将绑定到对应的实参上;否则,将实参的值拷贝后赋给形参。 指针的行为和其他非引用类型一样。当执行指针拷贝操作时,拷贝的是指针的值。...使用临时对象(temporary object)来保存函数的返回值。函数的返回值用于初始化调用点的一个临时对象,该临时对象就是函数调用的结果。其返回值为右值。不能作为左值。...当函数的返回值是引用类型时,其返回值即为return的变量,所以不需要临时对象保存其返回值。所以,对于返回值为引用类型的函数,其返回值为左值。...格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 } 常量指针:int* const,必须初始化,值不会改变 指向常量的常量指针:const int* const 始终指向一个常量对象且不能被修改...函数的返回值用于初始化调用点的一个临时对象,该临时对象就是函数调用的结果。所以,当函数返回值是自定义的值类型时,即使函数的返回值是局部变量,其返回值也是有效值。

    1.4K30

    C++中四种类型转换以及const_cast是否能改变常量的问题

    : const_cast(expr) 用来移除对象的常量性(cast away the constness) const_cast一般用于指针或者引用 使用const_cast去除...const限定的目的不是为了修改它的内容 使用const_cast去除const限定,通常是为了函数能够接受这个实际参数 static_cast(expr) 编译器隐式执行的任何类型转换都可以由...static_cast完成 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。...二、也许大家都有过这样的疑惑:const_cast可以去除一个常量的const属性,去除const属性后应该可以对“常量”进行修改,通过调试器发现内存中的值是被改变的,可是再传递这个“常量”的时候,值却一直保持原状...,如果程序员不注意而去修改了它会报错,现在我们利用const_cast去除了常量性,然后通过指针和引用对其进行了修改,所以通过指针打印或者引用传参的时候就能看出其内存确实变化了,但为了保护val这个变量本来的

    1.4K100

    【C++篇】迈入新世界的大门——初识C++(下篇)

    (但是在Java中就只使用引用,其引用就可以改变指向) 引用的使用 引⽤在实践中主要是于引⽤传参和引⽤做返回值中减少拷⻉提⾼效率和改变引⽤对象时同时改变被引⽤对象。...而传引用返回就跳过了这一拷贝步骤,直接返回变量的别名,就可以对变量进行修改了 所谓临时对象就是编译器需要⼀个空间暂存表达式的求值结果时临时创建的⼀个未命名的对象, C++中把这个未命名对象叫做临时对象...*3的结果保存临时对象中, int& rd = d 也是类似,在类型转换中也会产⽣临时对象存储中间值,也就是时,rb和rd引⽤的都是临时对象,⽽C++规定临时对象具有常性,所以这⾥就触发了权限放⼤,必须要...0 C中NULL被定义为⽆类型指针(void*)的常量 不论采取何种定义,在使⽤空值的指针时,都不可避免的会遇到⼀些⿇烦 如下: #include using namespace std...(C++规定void*类型的指针不能被隐式转换成任何类型的指针(必须显示转换)) 其实根本原因就是:在这之前C/C++标砖规定的NULL既是整数常量,也是空指针常量 所以C++11中引⼊nullptr,

    13010

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

    语法: const 数据类型 &引用名 = 被引用对象; 常引用的特点如下: 常引用只能引用常量或临时对象,不能引用非常量对象。...常引用不允许对被引用对象进行修改,即不能通过常引用修改被引用对象的值。 常引用可以接受非常量对象、常量对象和临时对象作为参数。 常引用可以提高程序的效率,因为常引用不需要创建临时变量。...常引用只能引用常量或临时对象,不能引用非常量对象。如果需要引用非常量对象并且不允许修改该对象的值,可以使用const修饰符来声明常量对象。...☁️传值与传引用效率比较 以值作为参数或者返回值类型,在传参和返回期间,函数不会直接传递实参或者将变量本身直接返回,而是传递实参或者返回变量的一份临时的拷贝,因此用值作为参数或者返回值类型,效率是非常低下的...☁️auto使用细节 ⭐auto与指针和引用结合起来使用 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加& ⭐在同一行定义多个变量 当在同一行声明多个变量时

    24710
    领券