首页 > 其他分享 >01.CPP前导

01.CPP前导

时间:2024-08-30 12:37:12浏览次数:3  
标签:std 初始化 01 函数 int C++ CPP 前导 标识符

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++) | Microsoft Learn

在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

相关文章

  • 第101期 低光可见光-红外配对数据集
    引言亲爱的读者们,您是否在寻找某个特定的数据集,用于研究或项目实践?欢迎您在评论区留言,或者通过公众号私信告诉我,您想要的数据集的类型主题。小编会竭尽全力为您寻找,并在找到后第一时间与您分享。重要性及意义一个用于低光视觉的可见光-红外配对数据集的重要性及意义主要体现在以......
  • 01-数组
    1.理论基础数组是存放在连续内存空间上的相同类型数据的集合。数组可以方便的通过下标索引的方式获取到下标下对应的数据。数组的简单示例:数组内存空间的地址是连续的正是因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。......
  • P8304 [CoE R4 D] 01 串
    思路:要注意到添加\(1\)和删除\(0\)是等价的。先令\(0\to-1\)。首先猜了一个结论,先顺着走,做一个前缀和,若当且位置的前缀和\(<0\),那么需要删除这个位置的\(0\),使得前缀和为正;然后再反着做一遍,那么答案就是删除的\(0\)的个数。暴力Code:intmain(){n=read(),......
  • 洛谷 P2680 [NOIP2015 提高组] 运输计划
    洛谷P2680[NOIP2015提高组]运输计划题意给出一棵树和\(m\)条路径,可以选择一条边,把边权改为\(0\),求\(m\)条路经长度最大值的最小值。思路看到最大值最小,可以想到二分答案,答案具有单调性。考虑如何判定答案\(x\)是否可行。统计所有长度大于\(x\)的路径,统计它们共......
  • Datawhale X 李宏毅苹果书(入门) AI夏令营 task01笔记
    官方学习链接:https://linklearner.com/activity/16/14/42机器学习基础导读        通俗来讲,机器学习就是让机器具备找一个函数的能力。这里指的“找一个函数”,指的是找一个能够描述一个场景数学规律的函数模型,具体方法大致是:让机器运行算法,通过输入的数据,确定合适的......
  • P10013 [集训队互测 2023] Tree Topological Order Counting
    Description给定一颗\(n\)个点的有根树,\(1\)是根,记\(u\)的父亲是\(fa_u\)。另给出一长度为\(n\)的权值序列\(b\)。称一个长度为\(n\)的排列\(a\)为这颗树的合法拓扑序,当且仅当\(\forall2\leu\len,a_u>a_{fa_u}\)。对每个点\(u\),定义\(f(u)\)为,在所有这......
  • luoguP5369 [PKUSC2018] 最大前缀和
    题目n<=20题解想了半天3位状态的折半,然后发现空间开不下(时间也不太行)所以放弃思考,直接枚举答案答案是a中的一个集合,设为S;记集合S的和为sum[S]考虑当S确定时,有多少种方案能使答案恰好为sum[S]。为了处理多种sum相同的情况,记S为从前往后考虑,第一次出现最大ans的集合;记剩余部......
  • L2-013 红色警报 分数 25
    时间复杂度N*M≈2.5e6#include<bits/stdc++.h>usingnamespacestd;intn=510,m;constintN=510;vector<pair<int,int>>path;//储存所有边intp[N];//储存祖宗节点boolflag[N];//判断是否已经被去除voidinit()//初始化所有祖宗节点{......
  • [2017 ICPC Nanning] Rake It In
    https://ac.nowcoder.com/acm/contest/32183/A一个很有意思的搜索,先手希望结果尽可能的大,后手希望结果尽可能的小。所以在枚举的时候,先后手的策略是不一样的。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;usingldb=longd......
  • L2-010 排座位 分数 25
    #include<bits/stdc++.h>usingnamespacestd;constintN=1000;intp[N];intfind(intx){if(p[x]!=x)p[x]=find(p[x]);returnp[x];}intmain(){intn,m,k;cin>>n>>m>>k;for(inti=1;i<=......