上一周把C语言简单的复习了一下子,收获还是蛮大的,但C语言中还有许多问题,希望在以后的练习中能够得到强化,从这周就开始了对C++语言的学习。
一、概述
1、C++简介
1.C++语言可以认为是对C语言的扩展,因此C++可以说是C语言的超集,这意味着任何有效的C语言程序都是C++程序。C++程序可以使用原有的C语言库。
2.C++语言在C语言的基础上添加了面向对象编程和泛型编程的支持。C++语言继承了C语言 高效,简洁,快速和可移值的传统。
3.C++语言融合了3种不同的编程方式:
- C语言代表的过程性语言
- C++在C语言的基础上添加的类代表的面向对象语言
- C++模板支持的泛型编程
C++与C语言的关系
- C++是C语言的加强,是一种更好的C语言
- C++是以C语言为基础的,并且完全兼容C语言的特性
2、简单的C++程序
#include<iostream>// 使用标准输入输出流 i:input o:output 相当于 stdio.h
using namespace std; //使用标准命名空间
int main() //程序入口函数
{
// cout 输出流对象 向屏幕中输出内容
// << 在C++中有新的意义
// endl 结束输入并换行
cout << "hello,world" << endl;
system("pause"); //暂停
return 0;
}
3、面向过程和面向对象
面向过程
- 面向过程是一种以过程为中心的编程思想
- 通过分析出解决问题所需要的步骤,然后用函数把这些步骤一个一个实现,使用的时候一个一个一次调用就好了
- 面向过程编程思想的核心:功能分解,自顶向下,逐层细化(程序=数据结构+算法)
- 面向过程编程语言存在的主要缺点是不符合人的思维习惯,而是要用计算机的思维方式去处理问题,而且面向过程编程语言重用性低,维护困难
面向对象
-
在面向对象中,算法与数据结构被称作一个整体,称作对象,现实世界中任何类的对象都有一定的属性和操作,也总能用数据结构与算法两者合一地来描述,所以可以用下面的等式来定义对象和程序:
对象 = 算法 + 数据结构
程序 = 对象 + 对象 + 对象 … -
面向对象编程思想核心
应对变化,提高复用 -
面向对象三大特性
封装 继承 多态
C++对C语言的扩展
1、双冒号作用运算符
- ::如果前面没有任何作用域,就代表了使用全局作用域
#include<iostream>
using namespace std;
int a = 10;
void f()
{
int a = 20;
cout << a << endl;
cout << ::a << endl;
}
int main()
{
f();
system("pause");
return 0;
}
2、命名空间
- 用途:解决命名冲突的问题
- 命名空间下,可以存放变量、函数、结构体、类…
- 命名空间必须声明在全局作用域下
- 命名空间可以嵌套命名空间
- 命名空间是开放的,可以随时向命名空间下添加新的成员
- 命名空间是可以匿名的
- 命名空间是可以起别名的
1.cpp
#include<iostream>
#include "1.h"
#include "2.h"
using namespace std;
void test1()
{
a::f();
b::f();
}
// 命名空间下,可以存放变量、函数、结构体、类......
namespace c
{
int a = 10;
void f1();
struct Teacher
{
int age;
};
class Circle
{
public:
int r;
};
}
// 命名空间必须声明在全局作用域下
// 命名空间可以嵌套命名空间
namespace d
{
int a = 10;
namespace e
{
int a = 20;
}
}
//命名空间是开放的,可以随时向命名空间下添加新的成员
namespace d
{
int b = 20;
}
// 命名空间是可以匿名的
namespace
{
int m_c = 10;
// 相当于在变量前加了一个关键字 static
// static int c = 10;
}
// 命名空间是可以起别名的
namespace longname
{
int m_d = 10;
}
void test5()
{
namespace shortname = longname;
cout << "long :" << longname::m_d << endl;
cout << "short :" << shortname::m_d << endl;
}
void test2()
{
cout << "d: a = " << d::a << endl;
cout << "e: a = " << d::e::a << endl;
}
void test3()
{
cout << "d: a = " << d::a << endl;
cout << "d: b = " << d::b << endl;
}
void test4()
{
cout << "m_c = " << m_c << endl;
}
int main()
{
// test1(); // 解决命名冲突的问题
/*namespace c {
}*/
// test2(); // 命名空间可以嵌套命名空间
// test3();
// test4();
test5();
system("pause");
return 0;
}
2.cpp
#include "1.h"
void a::f()
{
cout << "aaaaaaa" << endl;
}
3.cpp
#include "2.h"
void b::f()
{
cout << "bbbbbbb" << endl;
}
1.h
#pragma once
#include<iostream>
using namespace std;
namespace a
{
void f();
}
2.h
#include<iostream>
using namespace std;
namespace b
{
void f();
}
3、using声明和using编译指令
#include<iostream>
using namespace std;
namespace a
{
int a_a = 10;
}
namespace b
{
int a_a = 10;
}
void test1()
{
// int a_a =20;
using a::a_a; // using声明 当就近原则和using声明同时出现的时候,需要避免二义性
cout << "a::a_a = " << a_a << endl;
}
void test2()
{
//int a_a = 20;
// using 编译指令
using namespace a;
using namespace b;
cout << "a::a_a = " << a::a_a << endl;
// 如果有就近原则出现,优先使用仅仅原则
// 如果using编译指令存在多个并且有同名出现,需要加作用域区分
}
int main()
{
//test1();
test2();
system("pause");
return 0;
}