做网站自己申请域名还是建站公司,杭州发布官网,梅州高铁,彭州建设网站C中的模板
在其它语言中如Java或者C#中可能叫做泛型#xff0c;在C中为模板#xff0c;泛型的限制通常比模板多。模板可以解决多次的代码重复问题#xff0c;如以下场景
#include iostream
#include stringvoid print(int value)
{std::cout val…C中的模板
在其它语言中如Java或者C#中可能叫做泛型在C中为模板泛型的限制通常比模板多。模板可以解决多次的代码重复问题如以下场景
#include iostream
#include stringvoid print(int value)
{std::cout value std::endl;
}void print(float value)
{std::cout value std::endl;
}void print(std::string value)
{std::cout value std::endl;
}int main(void)
{print(Hello);print(10);print(1.1f);return 0;
}在这个场景中print函数设置初衷是为了输出参数与参数类型无关但为了输出功能需要多次重载极大地降低了开发效率于是可以通过template模板如下改造
#include iostream
#include stringtemplatetypename T
void print(T value)
{std::cout value std::endl;
}int main(void)
{print(Hello);print(10);print(1.1f);return 0;
}两片代码的效果是相同的但是用template后的代码更简单易读需要注意的是template后的函数为随用随编也就是当程序中调用才进行编译这点与一般的函数不同我们可以通过实验加深理解。
#include iostream
#include stringtemplatetypename T
void print(T value)
{std::cot va std::en
}int main(void)
{return 0;
}相较于上段代码这段代码中的print里有明显错误但是却可以成功编译并运行。
尖括号内的typename也可以换成class也没有影响或者直接改成int并且创建实例时输入参数这点可以看作宏来使用比如下面的场景
#include iostream
#include stringtemplateint N
class Array
{
private:int m_Array[N];
public:int GetSize() const { return N; }
};int main(void)
{Array5 array;return 0;
}C中的lambda函数
lambda函数就是一种简洁的匿名函数比如在做某个功能时突然要用一个函数但不想正式地去声明可以用lambda函数以下为简单示例。
#include iostreamint main(void)
{auto lambda_func [](int value){std::cout Value: value std::endl;};lambda_func(10);return 0;
}不难发现lambda函数的构成需要将本体复制给一个auto类型的变量以供随时调用lambda函数本体由[](){函数体}构成其中中括号内为捕获量。什么是捕获捕获是函数体内和函数外变量或常量之间沟通的渠道比如我们在lambda函数外定义了int x, y;两个变量我们可以捕获进lambda函数内对两个变量操作。
#include iostreamint main(void)
{int x 10, y 20;auto lambda_func [x, y](int value){std::cout x: x ,y: y std::endl;std::cout Value: value std::endl;};lambda_func(10);return 0;
}方括号内的多个参数由逗号隔开。
在上述示例中我们将lambda函数外的x, y两个变量通过捕获可以在函数体内读取但是我们不能更改他的值因为现在是只读的状态。如果想要在函数体内更改需要在变量前添加引用符号这样在lambda函数内更改变量本体而不是只读。
#include iostreamint main(void)
{int x 10, y 20;auto lambda_func [x, y](int value){x;std::cout x: x ,y: y std::endl;std::cout Value: value std::endl;};lambda_func(10);return 0;
}此外如果想要捕获匿名函数外的所有变量的只读可以使用[]想要捕获所有引用可以使用[]。
#include iostreamint main(void)
{int x 10, y 20;auto lambda_func1 [](int value){std::cout x: x ,y: y std::endl;std::cout Value: value std::endl;};auto lambda_func2 [](int value){x y 1;std::cout x: x ,y: y std::endl;std::cout Value: value std::endl;};lambda_func1(10);lambda_func2(10);return 0;
}C中命名空间
平常做项目不推荐使用using namespace std使用标准库这会让你的项目在移植后或者编译后产生错误虽然加了using namespace std可以让你使用标准库时变得轻松多了但是可能会产生重名的问题如何创建自己的namespace代码示例如下
#include iostream
#include stringnamespace MyNamespace {void print(const std::string value){std::cout value is: value std::endl;}
}int main(void)
{MyNamespace::print(Hello);return 0;
}当然你也可以在某一范围内使用命名空间比如
#include iostream
#include stringnamespace MyNamespace {void print(const std::string value){std::cout value is: value std::endl;}
}int main(void)
{using namespace MyNamespace;print(Hello);return 0;
}