今天开始学C++啦,跳过c语言,学完C++后接回C语言!
1.C++的特点:
1.C的超集,兼容C
2.面向对象思想
C++应用场景:游戏、服务器、图像处理、科学运算、操作系统、嵌入式开发等。
C++对比C语言的区别:
C++ C语言
面向对象 面向过程
开发效率高 开发效率没有上层语言高
运行效率比java高,但比C低 运行效率高
C与C++的最大区别在于它们的用于解决问题的思想方法不一样。
!!!C++文件以.cpp后缀!!!
2.C++程序类型
预处理的时候要打#include<iostream>
#include<iostream>
int main()
{
std::cout << "hello world" << std::endl;
std::cout << "hello world" << std::endl;
return 0;
}
iostream ——输出输入流 <istream> <ostream>
std——标准名称空间,为了避免变量或者函数命名冲突,对于标准库里面的东西设置了。
:: ---- 限定符
cout --- 输出 << 向屏幕输出内容
cin --- 输入 >>向内存写入内容
endl ---- 换行
比如
#include<iostream>
using namespace std;
int main()
{
int year , month , day;
std::cout << "请输入年月日:";
std::cin >> year >> month >> day;
std::cout << year <<"年"<< month <<"月"<< day <<"日"<< std::endl;
return 0;
}
如果一直输入输出都有std::可能会很麻烦
那我们可以在预处理位置下面输入下面这段话:
using namespace std;
注意:命名空间只能放在全局 这属于全局处理。
那么有全局就有局部——
using 命名空间::名称;
举个例子:
//全局 using namespace 命名空间名;
#include<iostream>
namespace A
{
int a;
int b = 40;
void show()
{
std::cout << "您好,C++" << std::endl;
}
namespace B
{
int b = 60;
}
}
using namespace A;
int main()
{
std::cout << b << std::endl;
std::cout << B::b << std::endl;
return 0;
}
//局部
#include<iostream>
namespace A
{
int a;
int b = 40;
void show()
{
std::cout << "您好,C++" << std::endl;
}
namespace B
{
int b = 60;
}
}
using A::b;
int main()
{
std::cout << b << std::endl;
std::cout << A::B::b << std::endl;
return 0;
}
一样的
3.引用
引用就是给变量起别名,常量指针
引用需要初始化,引用在只用自带解地址的效果。
使用格式:数据类型 &引用名=变量名
简单举个例子:
int a = 10;
int &p = a; // p就当做a用
cout << p << endl;
p = 40; // a = 40;
cout << a << endl;
交换两个变量值的函数。—— 需要操作外部空间 地址 -- 形参是指针
c语言写法:
#include<stdio.h>
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x=10;
int y = 20;
swap(&x,&y);
printf("%d %d\n",x,y);
}
C++的写法:
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp ;
temp = a;
a = b;
b = temp;
}
int main()
{
int x = 10;
int y = 20;
swap(x,y);
cout << x <<std::endl<< y << endl;
return 0;
}
tips:
1、引用必须初始化!!!
2、先有引用对象的空间才能定义引用!!!
3、能用引用就用引用,如果是动态内存申请只能用指针!!!
拓展
常引用:const 数据类型&引用名=名称;
int a = 30;
const int &q = a;
cout << q << endl;
// q = 60; 报错 q是read-only(如果存在这一步,编译时会报错)
cout << q <<endl;
// 在函数内部如何只对引用的空间进行读操作就可以设计形参为常引用。
int add(const int &a,const int &b)
{
return a + b;
}
4.函数形参可以有默认值
#include<iostream>
using namespace std;
int add(int a=1,int b=2)
{
return a + b;
}
int main()
{
int res = add();
cout << res << endl; // 默认值 1+2
int res1 = add(5);
cout << res1 << endl; // a的值是5,b的值默认
int res2 = add(5,6); // a的值是5,b的值是6
cout << res2 << endl;
return 0;
}
tips:
1.如果有多个参数,某个参数设置了默认值,他后面所有的参数都要设置默认值。
such as:
int test(int a,int b=2,int c=3)
{
}(a没有设置,但b设置之后,c也要跟着设置)
2.如果函数声明和函数定义同时存在,尽量将函数的默认值设置在函数的声明里面,只能有一个地方有默认值,不然会报错。
5.内联函数
inline修饰的函数,提高函数的执行效率,让函数减少跳转
inline int add(int a,int b)
{
return a+b;
}
int main()
{
int res = add(3,5); // 3 + 5
cout << res << endl;
return 0;
}
内联函数:提高函数的执行效率,需要更多的内存空间
Pay attention:
内联函数里面不能出现循环 或者 递归函数,如果里面出现了则编译器会当做普通的函数的函数来看。
一般内联函数只能是代码很少很简单的函数。
6.函数重载
对于同一个功能,可以使用同一个函数名,不同的形参(形参的类型,个数,顺序)。
代码执行的之后,判断传入的是什么数据,找到对应的函数进行执行。
底层到底怎么区分?
编译器检测到函数重载会使用形参和函数名的组合重新定义个名字。
1、函数的返回值类型不能作为函数值重载的判断
int add(int a,int b)
{
return a + b;
}
double add(int a,int b)
{
return a + b;
}
2、如果函数有默认值,小心冲突
#include<iostream>
using namespace std;
int add(int a,int b=2)
{
return a + b;
}
int add(int a)
{
return a;
}
int main()
{
int res = add(3); // 报错:函数重载冲突,编译器不知道要调用哪一个函数。
cout << res << endl;
return 0;
}
这就产生冲突了!
7.强制类型转换
C语言 int a=(int)4.5;
C++ int a = int(4.5);
8.string 字符串
C语言里面用数组
char str[30] = "hello";
char *p = "hello";
C++:字符串类型
string a = "hello";
string b = " world";
string c = a + b;
cout << c << endl;
例子(练习):
定义用户名和密码
输入用户名和密码
如果用户名是admin,密码是123456输出登录成功,否则登录失败
#include<iostream>
using namespace std;
int main()
{
cout<<"请输入账号:"<<endl;
string a;
cin>>a;
cout<<"请输入密码:"<<endl;
string b;
cin>>b;
string c="admin";
string d="123456";
if(a==c&&b==d)
{
cout<<"登陆成功!"<<endl;
}
else
{
cout<<"登录失败!"<<endl;
}
return 0;
}
9. new和delet
在堆区开空间,释放空间,人为申请,人为释放
new --- C语言:malloc --- 开空间
delete --- C语言:free --- 释放空间
在堆区申请一个int型的空间。
以下是没有释放空间的:
#include<iostream>
using namespace std;
int main()
{
int* p;
p = new int;
*p = 30;
cout << *p << endl;
//delete p;
//p = NULL;
cout << *p << endl;
return 0;
}
如果
delete p;
p=NULL;打入
则出现以下效果,空间被释放了,值就变成没有了
#include<iostream>
using namespace std;
int main()
{
int* p;
p = new int;
*p = 30;
cout << *p << endl;
delete p;
p = NULL;
cout << *p << endl;
return 0;
}
C++第一课就到这啦!