1. C++编程的介绍
1.1 第一个C++程序
// Text-printing program.
#include <iostream> // enables program to output data to the screen
// function main begins program execution
int main() {
std::cout << "Welcome to C++!\n"; // display message
return 0; // indicate that program ended successfully
}
每个程序都应该以注释开头用以解释程序的目的
第三行是预处理指令,是在程序被编译之前给预处理器的信息。这一行通知预处理器在程序中包括输入/输出流头文件<iostream>。此标头是一个包含信息的文件,编译器在编译任何将数据输出到屏幕或从键盘输入数据时使用使用C++的输入/输出流。关于<iostream>的更多细节会在后面的章节讨论。
int main() { }
main后面的括号表示main是一个称为函数的程序构建块。每个程序都必须有一个main函数。函数名前面的关键词指明函数的返回类型,函数名后面的括号,是书写形参之处,形参列表可以为空,大括号里的部分称为函数体。main()函数返回一个int值以指示程序的最终执行状态。main()函数要么没有参数,要么具有两个参数。例如:
int main(int argc,char* argv[]);
argc给出了传递给程序的实参数目,argv包含了这些实参。argv[0]可能是程序的名称,也可能是空字符串,所以不应该使用它。实参索引从1开始。
std::cout << "Welcome to C++!\n";
在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域中的所有标示符,而且其本身也是由标示符表示的。命名空间的使用目的是为了将逻辑相关的标示符限定在一起,组成相应的命名空间,可使整个系统更加模块化,最重要的是它可以防止命名冲突。就好比在两个函数或类中定义相同名字的对象一样,利用作用域标示符限定该对象是哪个类里定义的。
使用using std::cout 事先声明:cout<<"Hello!"<<std::endl;
//分别引入,需要用哪个引用哪个,保证程序中名称的唯一性
使用using namespace std声明:cout<<"Hello!"<<endl;
//引入名字空间的所有内容,不推荐这样写
在输出语句的上下文中,<<运算符被称为流插入操作符,操作人员执行此程序时,运算符右侧的值,即右侧操作数,将插入输出流中。请注意,<<运算符指向数据所在的位置。字符串文字面量通常按照它们出现在双引号之间的方式打印。但是,这些字符(\n)没有打印在屏幕上。反斜杠(\)被称为转义符。它表示要输出一个“特殊”字符。常见的转义字符如下图:
const对象一旦创建后其值就不能改变,所以const对象必须初始化。
std::endl和\n都可以表示程序一行的结尾。endl会在流中插入新的一行,并且把当前缓冲区中的所有内容输出。不应该过度的使用endl,会影响程序的性能。另一方面,使用\n不会自动刷新缓冲区。
1.2 初始化问题
可以使用大括号初始化,也可以使用等号和小括号初始化。
- 初始化的概念:创建变量时赋予它一个值(不同于赋值的概念)
- 类的构造函数控制其对象的初始化过程,无论何时只要类的对象被创建就会执行构造函数
- 如果对象未被用户指定初始值,那么这些变量会被执行默认初始化,默认值取决于变量类型和定义变量的位置
- 无论何时只要类的对象被创建就会执行构造函数,通过显式调用构造函数进行初始化被称为显式初始化,否则叫做隐式初始化
- 使用等号(=)初始化一个类变量执行的是拷贝初始化,编译器会把等号右侧的初始值拷贝到新创建的对象中去,不使用等号则执行的是直接初始化
- 传统C++中列表初始化仅能用于普通数组和POD类型,C++11新标准将列表初始化应用于所有对象的初始化(但是内置类型习惯于用等号初始化,类类型习惯用构造函数圆括号显式初始化,vector、map和set等容器类习惯用列表初始化)
初始化不等于赋值
初始化的含义是创建变量时赋予其一个初始值,而赋值的含义是把对象的当前值擦去,并用一个新值替代它。C++定义了初始化的好几种不同形式,例如我们定义一个int变量并初始化为0,有如下4种方式:
int i = 0;
int i = {0};//C++11
int i{0};//C++11
int i(0);
变量名不能和关键字重复。有效的标识符包括一系列字符(字母、数字和下划线)组成,并且不以数字开头。在C++中,区分字母的大小写,因此,A1和a1不是一回事。
变量的声明必须在变量使用的位置之前。
1.3 C++编程范式(C++ programming paradigm)
C++的编程范式包括:
1.结构化编程
2.面向对象编程
3.泛型编程
4.函数式编程
在计算机科学中,一个函数的副作用就是该函数除了返回计算结果之外,还对其他部分(如外部变量、数据结构、系统状态等)进行了修改或产生了其他影响。如果一个函数没有副作用,那么给定相同的输入,它总会产生相同的输出,而且不会改变系统的状态。例如下列的加法函数
def add(x,y):
return x+y
//没有副作用。无论调用多少次,只要输入相同,总是会返回相同的结果,而且不会改变系统的状态。
counter=0;
def increment_counter(x):
global counter
counter+=x
return counter
//有副作用,改变了全局变量counter的值
函数式编程鼓励使用无副作用的函数,因为这样的函数更容易理解和调试,也更容易进行并行和分布式计算。使得代码更加模块化。
1.4 命名空间/名字空间(name space)
详解c++的命名空间namespace - 知乎 (zhihu.com)
在c++中,名称(name)可以是符号常量、变量、函数、结构、枚举、类和对象等等。工程越大,名称互相冲突性的可能性越大。另外使用多个厂商的类库时,也可能导致名称冲突。为了避免,在大规模程序的设计中,以及在程序员使用各种各样的C++库时,这些标识符的命名发生冲突,标准C++引入关键字namespace(命名空间/名字空间/名称空间),可以更好地控制标识符的作用域。
命名空间是一个声明性区域,为其内部的标识符(类型、函数和变量等的名称)提供一个范围。 命名空间用于将代码组织到逻辑组中,还可用于避免名称冲突,尤其是在基本代码包括多个库时。 命名空间范围内的所有标识符彼此可见,而没有任何限制。 命名空间之外的标识符可通过使用每个标识符的完全限定名(例如 std::vector<std::string> vec;
)来访问成员,也可通过单个标识符的 using 声明 (using std::string
) 或命名空间中所有标识符的using namespace std;来访问成员。 头文件中的代码应始终使用完全限定的命名空间名称。
不要使用如下的命名空间写法:
using namespace std;
可以使用如下形式的写法:
using std::cout;
using std::endl;
1.5 声明与定义
声明是引入标识符并描述其类型,无论是什么类型,对象还是函数。编译器需要该声明,以便识别在别处使用该标识符。
extern int bar;
extern int g(int,int);
double f(int,double);
class foo;
定义是实例化这个标识符。链接器需要定义,以便将对标识符的引用链接到标识符所表示的实体。
int bar;
int g(int lhs,int rhs){
return lhs*rhs
};
class foo{
//do something
};
两者的区别:
1.定义有时可以取代声明,反之不可以
2.标识符可以被声明多次,但只能定义一次
3.定义通常伴随着编译器为标识符分配内存
标签:std,初始化,01,函数,int,C++,CPP,前导,标识符 From: https://www.cnblogs.com/yyyylllll/p/18388523