C++中的各种小细节(一)

一、多行字面值的处理
当处理一个很长的字符串的时候可以换行来写,只需要在第一行的行尾加上一个反斜线符号即可。

但是注意:当另起一行的时候不要在该行首添加额外的空格符,因为这些空格符号也会写入该字符串。

For Example:

std::string  a = "asdfghzxcv";
	std::cout<<a<<std::endl;//结果输出“asdfghzxcv”
	
	std::string::iterator iter = a.begin();
	for(;iter!=a.end();iter++)
	{
		std::cout<<*iter<<std::flush;
	}//结果输出“asdfghzxcv”

二、C++中变量初始化的两种形式:复制初始化、直接初始化

          int ival(100);//直接初始化
          int ival1=100;//复制初始化
                   但需注意:“初始化并不是赋值”,所以这两种形式总的来说都是调用构造函数来创建对象的,当用于类对象时
复制初始化和直接初始化的不同指出在于:直接初始化时会直接调用与实参匹配的构造函数,而复制初始化话时会总是
调用复制构造函数。


三、C++中的extern声明
在C++可以通过extern关键字声明变量或函数,也就是相当于扩展了变量或函数的作用域,其主要的用途是对于
那些在多个文件中都需要用到的变量或函数需要有与定义分离的声明,在这样的情况下,一个变量可以在一个.c或则.cpp
(如果是在头文件.h中定义的只需加上#include“”即可引用)文件中定义,当在其他文件中需要用到此变量或函数只需
用extern声明即可。
但有两三点需要注意:
1:在声明是必须向程序完成的表明该声明变量的类型和名字或函数返回值类型、函数名、函数形参类型等。
2:在多个不同的.cpp文件中如果出现了相同的变量名或函数名,编译器在把每个单独的目标文件编程可执
行文件后,在链接各个可执行文件时会发生重定义错误。
3:只能扩展全局作用域中的对象。


For Example:

//源.cpp
#include<string>
#include<iostream>
#include<iterator>
int main()
{       extern int ii;
	extern int a3;
	extern void fun();
	fun();
	std::cout<<a3<<std::endl;
	std::cout<<ii<<std::endl;
return 0;
}
        int a3  = 101;
	void fun()
	{
	}

//源1.cpp
int ii = 99099;

四、文件全局作用域中定义的const 对象的局部性

在一个文件的的全局作用域中定义的非const对象,其默认的形式为extern,也就是说其作用与是可以扩展的,
当在经历链接后,它在整个程序中都是可以访问的,只需同过extern扩展其作用域即可。
但是对于全局作用域中的const对象,其默认形式并没有指定为extern可扩展型,该对象就相当于定义该对象
文件里的一个局部变量一样,不能被其他文件访问。
如果要想const对象能够被其他文件访问则必须在定义的同时用extern关键字显示声明后,就可以被其他文件扩展引用。


For Example:

//源1.cpp
int ii = 99099;
extern const int ss = 22;//如果去掉extern则程序在链接时会报错。

//源.cpp
#include<iostream>
int main()
{       extern int ii;
	extern const int ss; //在声明是也要注明为const类型
	std::cout<<ii<<std::endl;
	std::cout<<ss<<std::endl;
return 0;
}

五、用getline()读取整行文本
getline()是一个非常有用的用来得到一个string对象的IO操作,该函数接受两个参数:一个输入流对象和一个string对象,


        注意:
           1:getline函数和输入操作符的不同之处在于:getline函数并不会忽略行开头的换行符,只要getline遇到换行符就会停止读入并
返回。
  2:getline函数会将istream参数做为返回值,因此可以将这个返回的输入流用来做判断。

For Example:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
  //从输入流中获取一行数据
  string  line;
  getline(cin,line);
  cout<<"输入流:"<<line<<endl;
  //从文件流中获取一行数据
  string fileline;
  ifstream is("E:\\C++PrimerTest\\a.txt");
  if(!is)
  {
	  cout<<"文件打开失败!!!"<<endl;
  }
  getline(is,fileline);
  cout<<"文件流:"<<fileline<<endl;
return 0;
}
---yyc

C++中的各种小细节(一)

上一篇:MongoDB 监控工具 mongostat


下一篇:【机器学习实战】:C++实现基于概率论的分类方法--朴素贝叶斯分类(Naive Bayes Classifier)