C++的特性
Bjarne Stroustrup博士在C语言地基础上引入并扩充了面向对象地概念,发明了一种新的程序语言,C++(面向对象,具有较强的抽象和建模能力)。
四大特性:封装、抽象、继承和多态。
1、输入和输出、命名空间(std cin cout)
#include <iostream>
//命名空间
using namespace std;
int main(void)
{
//cout就是黑屏幕
cout << "hello world" << endl;
return 0;
}
#include <iostream>
//iostream 提供一个叫命名空间的东西,标准的命名空间是 std
//方式二:
using std::cout;//声明命名空间中的一个变量
using std::endl;
int main(void)
{
//方式一
std::cout << "hello world" << std::endl;
std::cout << "goodbye world" << std::endl;
return 0;
}
键盘输入一个a的值,再把a打印出来。
int main(void)
{
int a = 0;
cout << "hello world" << endl;
cin >> a;//从键盘输入一个数据,给a
cout << "a= " << a << endl;
//"a="为字符串,后面的a为整型
return 0;
}
命名空间:作用域,区分相同名称的不同作用范围。
namespace AAA {
}
命名空间的三种方式
#include <iostream>
//方式二:
#if 0
using std::cout;//声明命名空间中的一个变量
using std::endl;
using std::cin;
//至此,方式二也开始麻烦起来了
#endif
//方式三
using namespace std;
int main(void)
{
#if 0
//方式一
std::cout << "hello world" << std::endl;
std::cout << "goodbye world" << std::endl;
return 0;
#endif
int a = 0;
cout << "hello world" << endl;
cin >> a;//从键盘输入一个数据,给a
cout << "a= " << a << endl;
return 0;
}
定义一个命名空间:(套娃,更好理解)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//定义一个命名空间
namespace spaceA
{
int g_a = 10;
}
namespace spaceB
{
int a = 20;
namespace spaceC
{
struct teacher//定义一个teacher变量
{
int id;//定义一个整型
char name[64];//定义了一个字符串
};
}
namespace spaceD
{
struct teacher//定义一个teacher变量
{
int id;//定义一个整型
char name[64];//定义了一个字符串
};
}
}
int main(void)
{
//using spaceA::g_a;
using namespace spaceA;
cout << g_a << endl;
//spaceB::spaceC::teacher t1;
//using spaceB::spaceC::teacher;
//teacher t1;
//using namespace spaceB::spaceC;
spaceB::spaceC::teacher t1;
t1.id = 10;
spaceB::spaceD::teacher t2;
t2.id = 20;
return 0;
}
2、三目运算符、const增强
a = 50,意味着把50赋值给a,
在C++中,三目运算符可以当左值。因为C++中返回的是别名(引用/变量本身),而不是变量的值,所以可以当左值。
int a=10;
int b=20;
(a<b)?a:b;//如果a<b,则取a;否则取b;
c=(a<b)?a:b;//把取到的值赋给c
((a<b)?a:b)=50;//则此时a=50,即三目运算符可以当左值
const int a, int const a 在C语言中都表示a是一个常量,在栈里面表示不可修改了;在C++中依然需要初始化。
const int *c 表示一个指向长整型数的指针(其中所指向的内存数据不可修改,但本身可以修改)
int * const d 常指针(指针变量不能被修改,但所指向的内存空间可以被修改)
const在int左边表示修饰变量,在int右边表示修饰指针,就看const后面是谁就行。
const int *const e e表示一个指向长整型的常指针(指针和它所指向的内存空间,均不能被修改)
C++中的const
const int a=10;
key | value |
a | 10 |
int *p=(int*)&a;如果对一个常量取地址,编译器会临时开辟一个空间temp,让这个指针存放这个临时空间的地址。
void test5()
{
const int a = 10;//a是真正的常量
int *p = (int*)&a;
*p = 20;//改变的是临时开辟的temp变量
cout <<"a=" << a <<endl;
cout <<"*p=" << *p <<endl;
int array[a] = { 0 };
}
3、引用
1、引用没有定义,是一种关系型声明。声明和它原有某一变量(实体)的关系。故而类型与原类型保持一致,且不分配内存。与被引用的变量有相同的地址。
2、声明的时候必须初始化,一经声明,不可变更。(即创建时引用被初始化为一个对象,就不能被指向到另一个对象。指针可以指向到另一个对象)
3、可对引用,再次引用。多次引用的结果是某一变量具有多个别名。
4、&符号前有数据类型时,是引用。其它皆为取地址。
可把引用作为参数,也可把引用作为返回值。通过使用引用来代替指针,会使C++程序更容易阅读和维护。
把引用作为参数示例:
#include <iostream>
using namespace std;
//函数声明
void swap(int& x, int& y);
int main()
{
//局部变量声明
int a = 100;
int b = 200;
cout << "交换前a的值:" << a << endl;
cout << "交换前b的值:" << b << endl;
//调用函数来交换值
swap(a, b);
cout << "交换后a的值:" << a << endl;
cout << "交换后b的值:" << b << endl;
return 0;
}
//函数定义
void swap(int& x, int& y)
//当我们将引用作为函数参数传递的时候,编译器会替我们将实参取地址给引用
{
int temp;
//对一个引用操作赋值的时候,编译器会替我们隐藏*操作
temp = x;//保存地址x的值
x = y;//把y赋值给x
y = temp;//把x赋值给y
return;
}
//当研究引用时,可以把引用当作一个常指针去研究。
//当在使用引用编程时,可以把引用理解为变量的别名。
引用如果当函数返回值的话,可以当左值。引用作为返回值,不要返回局部变量的引用,因为局部变量的地址会被返回,但局部变量的内存空间会被释放。
c++中将局部变量的引用作为返回_haohulala的博客-CSDN博客_c++ 返回局部变量的引用
const引用:对常量进行引用,要加const(const int & a=10;)
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
int main(void)
{
const int a = 10;//如果想对一个常量进行引用,必须是一个const引用
const int& re = a;//此时re的值是不可修改的,a是可以修改的
int b = 20;
const int& re2 = b;//相反,如果一个普通变量,用一个const引用接收是可以的
cout << "b=" << b << endl;
cout << "re2=" << re2 << endl;
b = 30;
cout << "b=" << b << endl;
cout << "re2=" << re2 << endl;
return 0;
}