C++ 学习笔记(针对一些容易忽略的知识点)

C++的函数

特殊用途语言特性

默认实参

为了使得所定义的函数既能接纳默认值,也能接受用户指定的值,我们把它定义成如下的形式:

string screen(int ht = 24, int wid = 80, char backgrnd = ' ');

一旦某个形参被赋予了默认值,它后面的所有形参都必须有默认值。

使用默认实参调用函数

函数调用时实参按其位置解析,因此只能省略尾部的实参。

string window;
window = screen();
window = screen(66);
window = screen(66, 256);
window = screen(66, 256, '#');

当设计含有默认实参的函数时,其中一项任务是合理设置形参的顺序,尽量让不怎么使用默认值的形参出现在前面,而让那些经常使用默认值的形参出现在后面。

默认实参声明(类似函数重载)

首次声明
string screen(int ht, int, char backgrnd = ' ');
错误:重复声明
string screen(int ht, int, char backgrnd = '*');
正确:添加默认实参
string screen(int ht = 24, int = 80, char backgrnd = '*');

局部变量不能作为默认实参,除此之外,只要表达式的类型能转换成形参所需的类型,该表达式就能作为默认实参

C++的类

构造函数

合成的默认函数

如果自定义的类没有显式地定义构造函数,那么编译器就会隐式地定义一个默认构造函数(又叫做合成的默认构造函数 )。

只有当类没有声明任何构造函数时,编译器才会自动地生成默认地构造函数。如果类钟包含一个其他的类类型成员且这个成员的类型没有默认构造函数,那么编译器无法初始化该成员。

=default的含义
class student
{
    public:
        // 默认构造函数
        student() = default;
        // 默认拷贝构造函数
        student(const student&) = default;
        // 默认运算符"="用于拷贝构造
        student& operator = (const student&) = default;
        // 默认析构函数
        ~student() = default;

    private:
        string name;
        float age;
        bool sex;
};

因为该构造函数不接受任何实参,所以它是一个默认构造函数。

在C++新标准中,如果我们需要默认的行为,那么可以通过在参数列表后面写=defaul来 要求编译器生成构造函数。

那么default有什么用?

  • 手动生成默认成员函数,提高代码运行效率。

default是必须使用的吗?

  • 不是,只有当类已经有了用户自定义的构造函数(编译器将不再为它隐式的生成默认构造函数),但程序员要用默认构造函数来创建类的对象时必须使用。

default的使用规则?

  • 仅适用于类的没有默认参数的特殊成员函数。

default只能在类内使用吗?

  • 不是,类的内外都可以使用,使用规则相同。

如果把default换成delete会怎样?

  • C++11中,当类中含有不能默认初始化的成员变量时,可以禁止默认构造函数的生成,
myClass()=delete;//表示删除默认构造函数
  • 当类中含有不能默认拷贝成员变量时,可以禁止默认构造函数的生成,
myClass(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝

myClass & operatir=(const myClass&)=delete;//表示删除默认拷贝构造函数,即不能进行默认拷贝

友元

类可以允许其他类或者函数访问它的私有成员,方法是令其他类或者函数成为它的友元(friend)

class student
{
    public:
    	friend void read_name(student& stu);

    private:
        string name;
        float age;
        bool sex;
};

void read_name(student& stu)
{
	cout<<stu.name<<endl;
}

令成员作为内联函数

定义在类内部的成员函数是自动inline的(内联函数

返回*this的成员函数

#include<iostream>
#include<string>
using namespace std;

class student
{
    public:
        string name;
        double age;
        bool sex;

        student set(string n, double a, bool s);
};

// 返回类型为本类型
student student::set(string n, double a, bool s)
{
    name = n;
    age = a;
    sex = s;

    return *this; // 将this对象作为左值返回
}

int main()
{
    student Tom;
    student Tom_2;
    // 返回一个拷贝
    Tom_2 = Tom.set("Tom", 24.0, true);
    cout<<"Tom_2 name = "<<Tom_2.name<<endl;
    // 嗲用该函数只能改变临时副本,而不能改变对象的值
    Tom.set("Tom", 24.0, true).name = "Jenny";
    cout<<"Tom name = "<<Tom.name<<endl;
}

结果:
Tom_2 name = Tom
Tom name = Tom
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值