C++:初识

c++与c的关系

c++是c语言的加强,c++是以c语言的基础的,完全兼容c语言的特性
c++程序可以使用已有的c程序库
c++在c语言的基础上添加了面向对象编程和泛型编程

c++入门:输出hello world

#include//标准输入输出流
using namespace std;//使用标准命名空间

int main() {
	//cout标准输出流对象
	//<<用于cout后拼接输出的内容
	//endl:end line刷新缓存区并换行
	cout << "hello world"<<endl;
	return EXIT_SUCCESS;
}

//====================
#include//标准输入输出流
//using namespace std;//使用标准命名空间

int main() {
	//不使用using namespace指定命名空间时需要在使用命名空间中的内容时指定命名空间
	std::cout << "hello world"<< std::endl;
	return EXIT_SUCCESS;
}

面向对象的三大特性

封装
继承
多态

作用域运算符:双冒号[::]

#define _CRT_SECURE_NO_WARNINGS
#include
//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;
}

你可能感兴趣的:(c/c++学习笔记,c/c++)