c++基础知识

2018-07-07 09:40:54

包含头文件

c++新式包含头文件的方式没有带 .h,这样就可以使用命名空间,虽然旧式可以写成 iostream.h,这样就不支持命名空间语法。

#include <iostream>

using namespace std;

如果要包含 C 的标准库文件,可以这样写。

//去掉.h,前面加上c
#include <cmath>

左值和右值

1.可以取地址的、有名字的就是左值,反之,不能取地址的、没有名字的就是右值(将亡值或纯右值) 2.将亡值则是C++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(移为他用),比如返回右值引用T&&的函数返回值、std::move的返回值,或者转换为T&&的类型转换函数的返回值。

int &a = 2;       // 左值引用绑定到右值,编译失败
int b = 2;        // 非常量左值
const int &c = b; // 常量左值引用绑定到非常量左值,编译通过
const int d = 2;  // 常量左值
const int &e = c; // 常量左值引用绑定到常量左值,编译通过
const int &b =2;  // 常量左值引用绑定到右值,编程通过

值得注意的是,只要能够绑定右值的引用类型,都能够延长右值的生命期。

int a;
int &&r1 = c;             # 编译失败
int &&r2 = std::move(a);  # 编译通过


命名空间

下面是偷懒的方式,所有 std 命名空间的名称都可用,使用时不必加上 std:: 前缀。

using namespace std;

cout << "hello freecls";

int test;
cin >> test;

也可以使特定名称可用,此时cout,endl使用时无需加上 std:: 前缀,而 cin 还是要加上。

using std::cout;
using std::endl;

//cout << "hello freecls\n";
cout << "hello freecls" << endl;

int test;
std::cin >> test;

总之,让程序能够访问名称空间std的方法有多种,下面是其中的4种。 

1.将 using namespace std;放在函数定义之前,让文件中所有的函数都能够使用名称空间std中所有的元素。

2.将 using namespace std;放在特定的函数定义中,让该函数能够使用名称空间std中的所有元素。

3.在特定的函数中使用类似 using std::cout;这样的编译指令,而不是 using namespace std;,让函数能够使用指定的元素,如cout。

4.完全不使用编译指令 using,而在需要使用名称空间 std 中的元素时,使用前缀 std∷,如下所示

std::cout << "I'm using cout and endl from the std namespace" << std::endl
namespace sg2 = boost::signals2;   //别名

下面是自定义命名空间

namespace dailei{
    int a;
    struct aaa{
        int b;    
    };
}

//可以在其他地方新增
namespace dailei{
    int b;
}

::a;                //全局


//匿名命名空间-静态存储内部连接(只在文件内部看的到)
namespace{
    int ice;
    int bandycoot;
}


源代码格式化

在c/c++中,回车和空格,制表符功能一样。

cout 等新功能

下面的 test 变量是 int 型,cout 可以智能的判断出test是一个需要转换的整数。cout 的智能是源于c++的面向对象特性,利用运算符重载。printf 则必须制定如 "%d %s" 等格式化字符串。

int test = 25;
std::cout << test << std::endl;
//拼接
cout << "my" << " website is " << "http://www.freecls.com" << endl;

cout << "my"
     << " website is "
     << "http://www.freecls.com"
     << endl;
//多个字符串换行拼接
char *tmp = "hello "
            "freecls "
            "guys";


c++ bool

//简单赋值
bool done = true;

int a = true;   //转换为1
int b = false;  //转换为0

bool start = -100;  //转成true
bool stop = 0;      //转成false


c++函数支持默认参数

void test(int a,int b=4){
    cout << a << " " << b << endl;
}

int main (){
    test(3);
}

//3,4

内联函数inline

1.速度稍快,但是内存占用提高 2.起始就是每次调用函数的地方都用代码填充

c++引用

引用必须初始化,且一旦初始化后指向一个变量,再也不能指向其他变量。

//正确
int i;
int &tmp = i;

//失败
int i;
int &tmp;
tmp = i;

引用的特点

1.引用必须初始化且不能改变
2.引用改变,该值也改变
3.只是传递引用而不是整个数据对象可以提高程序运行速度
4.如果对象很小如内置的基本数据类型最好按值传递
5.数组只能用指针
6.结构指针引用都可以传递
7.类对象只能用引用


c++11 auto、nullptr

auto n = 1;  //int

如果只是上面用法,那么auto其实可有可无。auto一般是用来处理复杂的类型,如标准模板库 STL 。

nullptr 代表空指针

str = nullptr


©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。