c++(二)一些默认的操作和函数信息

1、ifdef endif 条件编译

一般情况下所有的行都进行编译,但是如果只希望在满足条件下进行编译的话,那么就是条件编译操作,

条件编译命令最常见的形式为: 
#ifdef 标识符 
程序段1 
#else 
程序段2 
#endif
    
#ifndef <标识> 
#define <标识>

...... 
...... 

#endif
   
如:stdio.h 

#ifndef _STDIO_H_ 
#define _STDIO_H_

......

#endif 
    

2、program once

平时为了防止头文件的重复包含,会使用ifdef 或者#program once

  1. ifndef需要定义宏名,且可以跨平台使用,#program once却是windows专用的;
  2. ifndef相对于#program once而言,编译的效率低;
  3. ifndef 除了可以防止头文件重复包含,还可以防止文件内容或者代码块的重复包含

3、_getch();

_getch() 获取键盘中的鼠标移动方向操作。

_getch();
        direction = _getch();

4、system 函数

作用:执行系统命令调用命令处理器来执行命令。

如果命令是空指针,则该函数只检查是否有命令处理器可以被此函数使用。

命令非空则调用命令的效果取决于系统和库的实现,并可能导致程序以非标准的方式运行或者终止。

在windows系统中,system函数直接在控制台待用一个command命令,在linux/Unix系统中,system 函数会调用fork函数产生子进程,由子进程来执行command命令,命令执行完后随即返回原调用的进程。

5、constexpr 关键字的使用操作

constexpr修饰的函数也有一定的限制:

(1)函数体尽量只包含一个return语句,多个可能会编译出错;
(2)函数体可以包含其他语句,但是不能是运行期语句,只能是编译期语句;

编译器会将constexpr函数视为内联函数!所以在编译时若能求出其值,则会把函数调用替换成结果值。

在类的构造函数中也可以使用constexpr关键字

​ constexpr还能修饰类的构造函数,即保证传递给该构造函数的所有参数都是constexpr,那么产生的对象的所有成员都是constexpr。该对象是constexpr对象了,可用于只使用constexpr的场合。
​ 注意constexpr构造函数的函数体必须为空,所有成员变量的初始化都放到初始化列表中。

原文链接:https://blog.csdn.net/yao_hou/article/details/109301290

6、assert 函数的作用

assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:

#include<assert.h>
void assert(int expression);

assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:

7、Move 函数的运用

move函数作用主要是可以将一个左值转换成为一个右值引用,从而可以调用C++中的拷贝构造函数,在对象拷贝的时候,在运行时,他们呢不会产生一行代码圆形的对象也会清空,可以减少资源创建和释放:

move函数可以将左值转换成为右值引用,开业i避免不必要的拷贝操作,move是为性能而生的,move是将对象的或者所有权从一个对象转移到另一个对象,只是转移没有发生内存的搬迁或者内存靠别。

所有的临时变量都是右值

8、c++11中的c++ std::move 和std::forward

参考链接

c++中默认的传值方式是拷贝,而且临时变量拷贝的算力开销很大,于是产生了左值引用和右值,从而避免了临时变量拷贝开销。

将变量传到set函数里面:左值: const T & ****
class A{
public:
	void set(const string& v1, const string& v2) {
		v_a1 = v1;         // copy
		v_a2 = v2;         // copy
	}
private:
	string v_a1;
	string v_a2;
}

A a;
string value1("tmp value1");
string value2("tmp value2");
a.set(value1,value2);                 // copy
传递临时变量的时候,使用右值引用T&& 然后调用move函数从而避免copy操作
class A{
public:
	void set(string&& v1, string&& v2) {
		v_a1 = std::move(v1);         // copy
		v_a2 = std::move(v2);         // copy
	}
private:
	string v_a1;
	string v_a2;
}

A a;
a.set("tmp value1","tmp value2");                 // no copy


        • 从而变量和临时变量之间会导致参数不统一, 那么就需要进行函数的重载操作

为了解决上述问题:

forward函数

template<typename T1, typename T2>
void set(T1 && var1, T2 && var2){
	 m_var1 = std::forward<T1>(var1);
	 m_var2 = std::forward<T2>(var2);
}

右值引用参数的引用折叠
当var1为右值时,std::forward(var1)相当于static_cast<[const] T1 &&>(var1);
当var1为左值时,std::forward(var1)相当于static_cast<[const] T1 &>(var1)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值