C++入门

一、C到C++

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。于是诞生了面向对象语言C++,C++是由C一步步发展过来的面向对象的程序设计。
相比C,C++显著的特点是有了对象
what???对象??
是的,C++也是面向对象编程语言之一。
what??面向对象??那没有对象,怎么办??
new一个。
对象指的是类的实例,将对象作为程序的基本单元,将程序和数据封装其中。

在类和对象之后,相比C语言,C++还有继承和多态、模板和泛型、异常处理、C++库和标准模板库等。
在C++里,这里的面向对象,最大的特点就是有了的概念

重要历史变动
C with classes类及派生类、公有和私有成员、类的构造和析构、友元、内联函数、赋值运算符重载等
C++98以模板方式重写C++标准库,引入了STL(标准模板库)
C++11增加了许多特性,使得C++更像一种新语言,比如:正则表达式、基于范围for循环、auto关键字、新容器、列表初始化、标准线程库等

二、为什么C++支持函数重载?C语言不支持

重载:
1、因为Cpp在函数调用的时候,call指令是带着函数名和参数类型去调用函数的,所以参数不同,所调取的函数就不同。
例如:

#include<iostream>
using namespace std;


void Test()
{
	cout << "This is a test." << endl;
}
void Test(int a)
{
	cout << "the resut is  " << a << endl;
}
int main()
{
	int a = 10;
	Test();
	Test(a);
	system("pause");
	return 0;
}

这里写图片描述
在Cpp的程序中,Main函数可以根据参数列表不同而调用不同的Test()函数。
2、需要注意的是:函数返回值类型不是重载函数的调用时选择的的依据。
3、而C语言在调用函数时候只是用函数名去调用,如果出现两个相同函数名的函数,编译器无法区分,就会报错。不支持函数重载。
在这里插入图片描述

三、缺省参数–函数参数备胎

1、所谓的函数缺省参数就是,我在定义函数的时候会给我的函数形参赋默认值,如果你在调用我的函数时候,你没有给我的参数,那么编译器就会调用我给的默认值,称之为调用了缺省的参数。

#include<iostream>
using namespace std;


void Test()
{
	cout << "This is a test." << endl;
}
void Test(int b,int a=20)
{
	cout << "the resut is  " << a+b << endl;
}
int main()
{
	int b = 10;
	Test(b);
	system("pause");
	return 0;
}

这里写图片描述
调用Test()函数时,参数b给了实参,而a并没有给实参,a被定义为缺省参数,在没有被实例化时候,a可以用默认值20来跑。而给了实例参数,它就不会再用缺省值了。
这里写图片描述
2、需要注意的一点是:在定义函数时候,如果用到缺省参数,一定要从右向左缺省。也就是说,非缺省参数定义完,才能定义缺省的。
3、函数重载和带默认值的函数一起使用存在二义性:

int Add(int w);
int Add(int a=10,int b=20,int c=30);

当调用

Add(x);

在这里插入图片描述
4、如果函数定义在函数调用之后,在函数声明中给出默认值,在函数定义时就不要给出默认值了(可能出现“重复定义默认值”的报错)
在这里插入图片描述

四、命名空间

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

 namespace student
{
	char*name;
	int age;
}
#include<iostream>
#include<Windows.h>
namespace student
{
	char* _name = "xiaowei";
	int _age = 22;
}
namespace teacher
{
	char* _sex = "男";
}
int main()
{
	std::cout << student::_age << std::endl;
	using namespace teacher;
	std::cout << _sex << "\n";
	system("pause");
}

这里写图片描述
你发现了什么?是的,在需用调用命名空间里的成员时,要么使用空间名字::::被称之为作用域解析符。要么使用using namespace 空间名字

而常见的using namespace std;是调用了C++标准库里的所有成员。这样使用显然没有std::效率高,因为std::限定了域,就直接访问。而using namespace std;则需要把库里的所有能够成员展开,开销就大了,形成了命名空间污染的问题。

通常在一个C++代码中,习惯上,我不直接使用using namespace std;,只会在头文件下面加上using std::cout;using std::endl;,因为代码中会重复使用这两个,而其它的都会在对象前加上它所属于的域,比如std::vector

五、endl、cin、cout

cout是一个ostream类的对象,它与成员运算符函数operator<<搭配使用;cin则是istream流类的对象,与重载了>>运算符搭配使用;endl是std库的一个操作符函数,与<<搭配使用,单独使用,不需要任何参数。

#include <iostream>
using namespace std;

int main()
{
	int i;
	cin.operator>>(i);
	cout.operator<<(i);
	cout.operator<<(endl);
	system("pause");
	return 0;
}
100
100
请按任意键继续. . .
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值