c++语言在c语言的基础上添加了面向对象编程和泛型编程的支持。
#define _CRT_SECURE_NO_WARNINGS
#include
using namespace std;//标准命名空间
int main()
{
//cout是标准的输出流对象,打印字符串,
//endl是刷新缓冲区,并换行
cout << "hello world!" << endl;
system("pause");
return EXIT_SUCCESS;
}
封装,继承,多态
→ \rightarrow → 是因为解决多人合作时取标识符是重命名的问题
//命名空间
//A是空间的名字
namespace A{
int a;
void func()
{
// 命名空间内部可以写函数
}
}
//注意1:命名空间只能写在全局
//注意2:命名空间可以嵌套命名空间
//命名空间可以嵌套命名空间
namespace Maker
{
int a;
namespace B
{
int b;
}
}
//注意3:命名空间是开放的,随时可以加入新成员
//但是新成员只能在加入后使用
namespace Maker
{
int a;
namespace B
{
int b;
}
}
// 在此处用函数使用Maker,int c用不到
namespace Maker
{
int c;
}
// 在此处用函数使用Maker,int c用得到
//注意4:匿名命名空间
//类似于static int d=50;
// 只在本.cpp文件中使用
namespace
{
int d = 50;
}
//注意5:命名空间可以取别名
void test01()
{
// 新名字 旧名字
namespace nameMaker = Maker;
cout << nameMaker::a << endl;
}
//注意6:分文件编写代码时,如果.h中有两个命名空间
//但是里面的成员函数或成员变量同名时
//在.cpp中实现函数时,需要加上命名空间
//test.h文件
#pragma once
#include
using namespace std;
namespace myMaker1
{
void func();
}
namespace myMaker2
{
void func();
}
//test.cpp文件
#include "test.h"
void myMaker1::func()//需要在函数名前面加入确定命名空间名字
{
cout << "func" << endl;
}
作用域运算符双冒号::
用来访问某个作用域里面的成员
using声明是让命名空间中某个标识符可以直接使用
namespace A
{
int a = 10;
int b = 20;
int c = 30;
}
void test01()
{
//using声明是让命名空间中某个标识符可以直接使用
using A::a;
cout << a << endl;
//int a = 50;
//注意:using声明了某个变量,在该作用域内不能定义同名的变量
}
using编译指令,让某个命名空间中的标识符都可以直接使用
namespace A
{
int a = 10;
int b = 20;
int c = 30;
}
void test02()
{
//using编译指令,让某个命名空间中的标识符都可以直接使用
using namespace A;
cout << a << endl;
cout << b << endl;
cout << c << endl;
int a = 100;
//为什么不会冲突
//类似于命名空中的a是全局变量,这里的a的局部变量
//定义int a之后,namespace的a变量失效了
cout << "a=" << a << endl;
}
加强一:定义变量时不需要使用struct关键字
加强二:结构体内可以写函数
不能隐性的转换,必须显示的转换
也就是说:必须要用强制转换,不能不写
C语言的三目运算符返回的是右值
C++语言的三目运算符返回的是左值,是空间
放在赋值操作符左边的是左值,放在右边的是右值
在一个文件使用const全局变量,在其他文件使用extern带过来
const int aa = 10;//没有内存
void test01()
{
//发生了常量折叠
cout << "aa=" << aa << endl;//在编译阶段,编译器:cout<<"aa="<<10<
//禁止编译器优化的关键字:volatile
//volatile const int bb = 20;//栈区
const int bb = 20;
int *p = (int*)&bb;
//进行了取址操作,所以有空间
*p = 200;
cout << "bb=" << bb << endl;//cout << "bb=" << 20 << endl;
cout << "*p=" << *p << endl;
cout << "a的地址=" << (int)&bb << endl;
cout << "p指向的地址" << (int)p << endl;
}
extern const int c = 300;
//加上extern就变为外部链接属性
// 在其他.c文件中使用这个const常量
→ \rightarrow → 不能优化自定义数据类型,结构体
→ \rightarrow → 如果用变量给const修饰的局部变量赋值,那么编译器就不能优化
→ \rightarrow → 编译器是在编译阶段来优化数据
→ \rightarrow → define没有数据类型,const修饰的变量有数据类型,可以进行数据类型检查,在使用具有重载的函数比较好用
#define MA 128
const short ma = 128;
void func(short a)
{
cout << "func(short a)" << endl;
}
void func(int a)
{
cout << "func(int a)" << endl;
}
int main()
{
func(ma);
system("pause");
return EXIT_SUCCESS;
}
→ \rightarrow → const修饰的变量有作用域,define不重视作用域,不能限定常量的使用范围
和C语言的指针一样的功能,并且使语法更加简洁
引用是给空间取别名
void func(int &a)
//int &a=a;
{
a = 200;
}
void test02()
{
int a = 10;
func(a);
cout << "a=" << a << endl;
}
注意1:int &b = a;
这里&不是取地址操作符,是引用的标记作用
注意2:引用创建时,必须初始化。int &pRef; //error
注意3:引用一旦初始化不能改变它的指向
注意4:引用必须引用一块合法的内存空间
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
//第一种方法(常用)
//1.定义数组类型
typedef int(MY_ARR)[5];//数组类型
//2.建立引用
MY_ARR &arref = arr;//建立引用,int &b=a;
//第二种方法(常用)
//直接定义引用
int(&arref2)[5] = arr;// int &b=a
//第三种方法
typedef int(&MY_ARR3)[5];//建立引用数组类型
MY_ARR3 arref3 = arr;
for (int i = 0; i < 5; i++)
{
cout << arref[i] << endl;
}
cout << endl;
for (int i = 0; i < 5; i++)
{
arref2[i] = 100 + i;
cout << arref2[i] << endl;
}
system("pause");
return EXIT_SUCCESS;
}
引用的本质是编译器在内部使用常指针来实现
//发现是引用,转换为 int* const ref = &a;
void testFunc(int& ref){
ref = 100; // ref是引用,转换为*ref = 100
}
int main(){
int a = 10;
int& aRef = a; //自动转换为int* const aRef = &a;这也能说明引用为什么必须初始化
aRef = 20; //内部发现aRef是引用,自动帮我们转换为: *aRef = 20;
cout << "a:" << a << endl;
cout << "aRef:" << aRef << endl;
testFunc(a);
return EXIT_SUCCESS;
}
指针的引用是给指针变量这块空间取别名
void test01()
{
char* p = "翠花";
char* &p1 = p;
cout << p1 << endl;
}
//被调函数
void func(char* &tmp)//char* &tmp=mp;
{
char *p;
p=(char*)malloc(64);
memset(p, 0, 64);
strcpy(p, "小花");
tmp = p;//省了*
}
//主调函数
void test02()
{
char* mp = NULL;
func(mp);//省了&
cout << mp << endl;
}
C语言的结构体不能写函数,C++可以
结构体定义变量时,C++不需要加struct关键字
更加严格的类型检查
const修饰的变量,C++有时没有内存,C语言的都有内存
三目运算符返回的值不一样
引用和C语言的指针功能一样