C++-note1


更多请查看我的个人博客:
https://beatjerome.github.io


字符函数库cctype

isalnum()   判断是否是字母或数字
isalpha()   判断是否是字母
isdigit()   判断是否是数字
ispunct()   判断是否是标点符号
isspace()   判断是否是空格
isupper()   判断是否是大写字母
islower()   判断是否是小写字母

写入文本

1.包含头文件fstream
2.创建一个ofstream对象
3.将该ofstream对象同一个文件关联起来
4.如使用cout一般使用该对象

//范例程序
//在目录下创建名为Hello world.txt的文件
//写入内容
#include<iostream>
#include<fstream>
using namespace std;
int main(){
    ofstream outFile;
    outFile.open("Hello world.txt");
    cout<<"Hello world";
    outFile<<"Hello world";
    outFile.close();
    return 0;
}

这只是简单的输出文本。如果原本的输出文本已有内容,这种输出方式会将文本内容清空后重新写入。


读取文本

1.包含fstream头文件
2.创建一个ifstream对象
3.将该对象和文件关联起来
4.结合ifstream对象和运算符>>读取各种数据

//范例程序
#include<iostream>
#include<fstream>
using namespace std;
int main(){
    ifstream inFile;
    inFile.open("Hello world.txt");
    while(inFile.good()){
        char ch;
        inFile>>ch;
        cout<<ch;
    }
    inFile.close();
    return 0;
}

默认参数
默认参数指的是当函数调用中省略了实参时自动使用的一个值。它提供了一种便捷的方式。在设计类时,通过使用默认参数,可以减少要定义的析构函数、方法以及方法重载的数量。

//如果希望使用默认参数,即给函数参数一个默认值
//将参数n的默认值设为1
const *left(const char *str,int n=1);

函数重载

默认参数可以使用不同数目的参数调用同一个函数。
而相对的,函数重载(函数多态)可以使用多个同名的函数。

函数重载的关键是函数的参数列表—也称为函数特征标。C++允许定义名称相同的函数,条件是它们的特征标不同。

//范例print函数
void print(const char *str,int width);
void print(double d,int width);
void print(longl,int width);
void print(int i,int width);
void print(const char *str);

如果调用的函数没有原型匹配。C++将尝试使用标准类型转换强制进行匹配。但如果有多个原型,则会拒绝这种调用,并将其视为错误。

//只允许对函数参数区别进行函数重载
//不允许对函数类型区别进行函数重载
long gronk(int n,float m);
double gronk(int n,float m);

函数模板
函数模板是通用的函数描述,也就是说,它们使用泛型来定义函数,其中的泛型可以用具体的类型(int 和double)替换。

//交换函数模板范例分析
template <typename AnyType>
void Swap(AnyType &a,AnyType &b)
{
    AnyType temp;
    temp=a;
    a=b;
    b=temp;
}

第一行指出,要建立一个模板,并将类型命名为AnyType。关键字template和typename是必须的,但是class可以用来替换typename。

函数模板的意义在于,当你调用该函数,如该交换函数而言,如果你给的参数是int或者double,AnyType就会替换成所给的参数的类型。

还有一点要注意的是,与C中相同,函数模板中也不需要所有的参数类型都需要用泛型.


显式具体化
显式具体化是对于模板而言的,即对于函数模板而言,有些类型的操作无法实现,需要specialize。简单的理解就是,写定一个函数模板后,通过显式具体化来拓宽模板的应用范围。

具体化优先于常规模板
而非模板函数优先于具体化和常规模板

//非模板函数、模板函数和显式具体化模板函数
void swap(job &,job &);    //非模板函数

template<typename T>        //模板函数
void swap(T &,T &);

template <> void swap<job>(job &,job&); //显式具体化

swap中的不是必须的,可写可不写


显式实例化*

template <> void swap<int>(int &,int &);    //显式具体化
template <>void swap(int &,int &);  //显式具体化
template void swap<int>(int ,int ); //显式实例化

显式实例化将使用swap()模板生成一个使用int类型的实例。
Explicit instantiation lets you create an instantiation of a templated class or function without actually using it in your code. Because this is useful when you are creating library (.lib) files that use templates for distribution, uninstantiated template definitions are not put into object (.obj) files.
(For instance, libstdc++ contains the explicit instantiation of std::basic_string

template<class T1,class T2>
void ft(T1 x,T2 y)
{
    ...
    xpy=x+y;    //xpy的类型无从知晓
    ...
}

C++中新增关键字decltype提供了解决方案

//利用decltype关键字来声明类型
template<class T1,class T2>
void ft(T1 x,T2 y)
{
    ...
    decltype(x+y) xpy=x+y;    
    ...
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值