c++与c的关系
c++是c语言的加强,c++是以c语言的基础的,完全兼容c语言的特性
c++程序可以使用已有的c程序库
c++在c语言的基础上添加了面向对象编程和泛型编程
c++入门:输出hello world
#include<iostream>//标准输入输出流
using namespace std;//使用标准命名空间
int main() {
//cout标准输出流对象
//<<用于cout后拼接输出的内容
//endl:end line刷新缓存区并换行
cout << "hello world"<<endl;
return EXIT_SUCCESS;
}
//====================
#include<iostream>//标准输入输出流
//using namespace std;//使用标准命名空间
int main() {
//不使用using namespace指定命名空间时需要在使用命名空间中的内容时指定命名空间
std::cout << "hello world"<< std::endl;
return EXIT_SUCCESS;
}
面向对象的三大特性
封装
继承
多态
作用域运算符:双冒号[::]
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
//using namespace std;
int atk = 1000;
void test0201() {
int atk = 2000;
std::cout << "atk=" << atk << std::endl;//输出2000
//::代表作用域,如果前面什么都不添加代表全局作用域
std::cout << "全局atk=" << ::atk << std::endl;//输出1000
}
int main()
{
test0201();
//system("pause");
return EXIT_SUCCESS;
}
namespace命名空间
命名空间用途:解决名称冲突
- 命名空间下可以放:变量、函数、结构体、类
namespace A {
int a;
void fun() {}
struct b {};
class c {};
}
- 命名空间必须声明在全局作用域下
- 命名空间可以嵌套命名空间
namespace B {
int a;
namespace C {
int a;
}
}
- 命名空间是开放的,可以随时给命名空间添加新成员
- 命名空间可以是匿名的(匿名空间相当于全局区域,可以使用::访问空间内容,也可以直接访问空间内容)
- 命名空间可以起别名
namespace veryLongName {
int a = 10000;
}
void test0301() {
namespace veryShortName = veryLongName;
cout << veryLongName::a << endl;
cout << veryShortName::a << endl;
}
using声明以及编译
using声明与就近原则同时出现时会报错
using编译与就近原则同时出现使用就近原则
namespace King {
int sunId = 1;
}
void test0401() {
int sunId = 2;
//using声明
using King::sunId;
//error:using声明导致多次声明
cout << King::sunId << endl;
}
void test0402() {
int sunId = 2;
//using编译
using namespace King;
cout << sunId << endl;
}
C++对C语言的增强和扩展
- 全局变量检测:C++可以检测重定义
- 函数检测:C++可以检测返回值、形参类型、函数调用参数个数
- 类型转换检测:C++赋值语句需要强转类型
- struct增强:C++结构体可以放函数,C++声明结构体时可以不加struct关键字
- bool类型扩展:C++有bool类型
- 三目运算符增强:C++可以执行如下语句
a > b ? a : b = 100;
,C实现相同功能需要使用*(a > b ? &a : &b) = 100;
【c语言下返回的是值,c++语言下返回的是变量】 - const
c语言下全局const不能通过指针更改,局部const可以通过指针更改
c++语言下全局const不能通过指针更改,局部const通过指针修改不会起作用
//全局const
const int m5 = 100;
void test0505() {
/*int* p = &m5;
*p = 200;
printf("%d\n", m5);*/
//局部const
const int m5_ = 100;
int* p_ = &m5_;
*p_ = 200;
printf("%d\n", m5_);
}
c语言下const修饰的全局变量默认是外部链接属性
c++语言下const修饰的全局变量默认是内部链接属性,需要显示声明extern
//c++其他文件声明const属性
extern const int g_a = 1000;
//c++使用其他文件声明的const属性
extern const int g_a;
cout << "g_a="<<g_a << endl;
//c其他文件声明const属性
const int g_a = 1000;
//c使用其他文件声明的const属性
extern const int g_a;
printf("%d\n", g_a);
const分配内存
//对const变量取地址会分配临时内存,指针不会修改const修饰的内容
void test0901() {
const int a = 10;
int* p = (int*)&a;
}
//使用普通变量初始化const变量时可以修改const修饰的内容
void test0902() {
int a = 10;
const int b = a;
int* p = (int*)&b;
*p = 1000;
cout << b << endl;
}
//自定义数据类型,可以修改const修饰的内容
struct Person {
string m_Name;
int m_Age;
};
void test0903() {
const Person p = {};
Person* pp = (Person*)&p;
(*pp).m_Name = "tom";
pp->m_Age = 10;
cout << "姓名:"<<pp->m_Name << " 年龄:" << pp->m_Age << endl;
}