C++基础知识1
原文链接(点击原文链接获取更多学习干货):
http://blog.bools.cn/archives/1346
一、c++类型打印c语言
#include<iostream>
using namespace std;
int main()
{
cout << "hello world" << 1245 << endl;
system("pause");
return 0;
}
注意:
1、#include是标准的输入输出流,in是输入,out是输出,cout输出就包含在这个头文件里面
2、using namespace std;这是为了创建一个空间std来存放内容,如果不写这行代码,可以用以下方法来代替:
std::cout<<“hello world”<<12345<<std::endl
3、cout是c++里面用到的输出模式,和printf一样。
4、<<左移运算符在这里做拼接的作用。
5、endl是结束换行的意思,和\n效果相同。
6、 system(“pause”);起到的是阻塞作用,如果不加这行代码,编译后的效果将是一闪而过,不会停留在那个编译页面。
二、面向对象的三大特性
1、封装
2、继承
3、多态
三、双冒号::的作用
双冒号是 作用域运算符 ::全局作用域,
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int atk = 200;
void test01()
{
int atk = 100;
```c++
cout << "攻击力为 : " << atk << endl;
cout << "全局攻击力为 : " << ::atk << endl;//如果这样写那么打印出来的的是200
}
int main(){
test01();
system("pause");
return EXIT_SUCCESS;
}
三、**c++相比较c语言的增强**
1、全局变量检测增强
即不能重复定义听一个变量
int a;
int a=10;
```**//报错**
2、函数检测增强
即必须定义变量的类型
void using(int a,int b)
{
return a*b;
}
3、struct内可以增加函数
struct Person
{
int m_age;
void m _plus();//这样不会报错,但c语言中就会报错
}
void test()
{
Person p1;//不加struct关键字不会报错
}
4、三目运算符增强
#include<iostream>
using namespace std;
void my_in()
{
int a = 10;
int b = 20;
(a > b ? a : b)=100;
cout << a <<endl<< b << endl;
}
int main()
{
my_in();
return 0;
}
注意:
c++中三目运算符传递出来的是变量b,所以打印出来的结果是b=100
5、const的增强
#include<iostream>
using namespace std;
void test05()
{
const int b = 10;
int* p = (int*)&b;
*p = 100;
cout << "*p=" << *p << endl;
cout << "b=" << b << endl;
}
int main()
{
test05();
return 0;
}
注意:
输出的结果是*p=100;b=10。这是因为在c++中,const不会给b新开辟一个空间,所以指针无发通过空间去修改他的那个值。
const分配内存情况
1、加地址符号会增加一个临时内存,但是无法修改,如上。
2、添加extern编译器会给const变量分配内存。
void test01()
{
extern const int m_A = 10;
int * p = (int*)&m_A;
}
3、用普通变量初始化const
void test02()
{
int a = 10;
const int b = a;
int * p = (int *) &b;
*p = 1000;
cout<<"b="<<b<<endl;
}
int main()
{
test02;
return 0;
}
结果为b=1000;
总结:用const去替代#define
namespace的使用
1、namespace命名空间,主要使用来解决命名冲突的问题
当多个文件编程时,命名起冲突,这个时候就要用到namespace
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include "game1.h"
#include "game2.h"
void test01()
{
LOL::goAtk();
KingGlory::goAtk();
}
文件1头文件:
#include<iosteam>
using namespace std;
namespace LOL
{
void gostck();命名
}
文件1源文件:
#include<game1.h>
void LOL::stck()
{
cout <<"LOL攻击实现"<<endl;
}
注意:
需要用作用域符号去连接,意思是LOL作用域下的stck
2、命名空间下可以放函数、变量、结构体、类
3、命名空间必须定义在全局作用域下,不能放在主函数里面定义
3、命名空间可以嵌套命名空间,即在一个空间里面你可以在命名一个空间
namespace A
{
namespace B
{
int m_A=10;
}
}
void test()
{
cout <<"作用域B下的m_A的值:"<<A::B::m_A<<endl
}
注意:
A::B::m_A,打印的时候就必须这样层层说明,意思就是A作用域下的B作用域下的m_A。
4、命名空间是开放的,可以随时网原先的空间添加内容,意思就是前面定义了A,后面在定义一个A不会覆盖前面的A,只会添加进前面那个A里面。
5、可以定义无名的命名空间
namespace
{
int m_b=10;
}
注意:
无名命名空间,相当于static int m_b=10;,意思是只能在当前文件内使用
6、命名空间可以起别名
namespace A
{
int m_c=10;
}
void test01()
{
namespace B=namespace A;
cout <<A::m_c<<B::m_c<<endl;
}
这样子打印的话两个值将会相同
四、using的使用
1、using用于声明
#include<iostream>
using namespace std;
namespace A
{
int m = 10;
}
namespace B
{
int m = 20;
}
void test01()
{
using A::m;
cout << m << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
注意:
用using声明要注意二义性,即如果前面已经定义了想通一个变量名,就会报错。
2、using编译指令
#include<iostream>
using namespace std;
namespace A
{
int m = 10;
}
namespace B
{
int m = 20;
}
void test01()
{
using namespace A;
using namespace B;
cout << A::m << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
注意:
using namespace A;这是指打开A空间里面,用里面的值,但是也要注意二义性,因为当打开多个空间时,就要在输出那里注明是那个作用域下的值。
五、参数的传递
1、值传递
2、地址传递(利用引用来实现)
(以前都是通过指针来实现)
#include<iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp = a;
a =b;
b =temp;
}
void text05()
{
int a = 10;
int b = 20;
swap(a, b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
}
int main()
{
text05();
system("pause");
return 0;
}
注意事项:
1、不要返回局部变量的值
int& dowork()
{
int a = 10;
return a;
}
void text08()
{
int& ret = dowork();
cout << "ret=" << ret << endl;
cout << "ret=" << ret << endl;
cout << "ret=" << ret << endl;
}
int main()
{
//text05();
text08();
system("pause");
return 0;
}
结果就是,第一次是正确的,但是后面几次打印都是乱码。
2、如果函数的返回值是引用,那么这个函数调用可以作为左值
dowork2() = 1000; //相当于写了 a = 1000;
欢迎关注技术公众号,获取更多软件学习干货!