使用c++语言编写一个求圆的面积的程序:
#include"iostream"//包含C++的头文件
using namespace std;//使用std标准命名空间(在这个命名空间中定义了很多标准定义)
void main01()
{
//printf("helloworld\n");
//cout 标准输出
//endl 回车换行
cout << "hello world" << endl;
system("pause");
}
//求圆的面积
//用面向过程的方法求圆形面积
int main02()
{
double r = 0;
double s = 0;
cout << "请输入原型半径:";
cin >> r;//跟scanf 功能类似
cout << "r的值是:" << r << endl;
s = 3.14 * r * r;
cout << "圆形面积是s:" << s << endl;
system("pause");
return 0;
}
//--------------------------------------------
//面向对象求解圆的面积 定义了一个圆的数据类型
struct circle
{
double m_s;//圆的面积
double m_r;//圆的半径
};
//类是一个抽象的概念,不会分配内存
//用数据类型定义变量的时候,才会分配内存
class Mycircle
{
public:
double m_s;//圆的面积
double m_r;//圆的半径
public:
void setR(double r)//成员函数
{
m_r = r;
}
double getR()
{
return m_r;
}
double getS()
{
m_s = 3.14 * m_r * m_r;
return m_s;
}
};
//面向过程加工的是一个个的函数
//面向对象加工的是一个个的类
int main0103()
{
Mycircle c1, c2, c3;//用类 定义变量 对象c1、c2
double r1, r2, r3;
cout << "请输入c1圆的半径:";
cin >> r1;
//给c1圆的属性赋值
c1.setR(r1);
cout << "c1圆形的面积是:" << c1.getS() << endl;
cout << "请输入c2圆的半径:";
cin >> r2;
//给c2圆的属性赋值
c2.setR(r2);
cout << "c2圆形的面积是:" << c2.getS() << endl;
cout << "请输入c3圆的半径:";
cin >> r3;
//给c3圆的属性赋值
c3.setR(r3);
cout << "c3圆形的面积是:" << c3.getS() << endl;
system("pause");
return 0;
}
命名空间的概念:
#include"iostream"
using namespace std;
//1.文件中 iosteam 没有引入标准std ,需手动写
//2.若不写 using namespace std 需显示的 引入std。 std::cout << "namespace test" << std::endl;
void main0201(void)
{
std::cout << "namespace test" << std::endl;
system("pause");
}
//3.定义命名空间
namespace namespaceA
{
int a = 0;
}
namespace namespaceB
{
int a = 10;
namespace namespaceC
{
struct Teacher
{
char name[32];
int age;
};
}
}
//4.使用命名空间
void main0202(void)
{
using namespace namespaceA;
using namespace namespaceB;
cout << namespaceA::a << endl;
//cout << namespaceB::a << endl;
//路径写全
//namespaceB::namespaceC::Teacher t1;
//t1.age = 33;
//cout << t1.age << endl;
using namespaceB::namespaceC::Teacher;
Teacher t2;
t2.age = 31;
cout << t2.age << endl;
system("pause");
}
布尔类型的数据
#include"iostream"
using namespace std;
void main0401()
{
bool b1 = true;//1字节大小
bool b2, b3, b4;//多个bool变量定义在一起可能会占1个bit
cout << "sizeof(bool):" << sizeof(bool) << endl;
//bool 变量 1或0
b1 = 10;
cout << "b1:" << b1 << endl;
b1 = 0;
cout << "b1:" << b1 << endl;
system("pause");
}
三目运算符与c语言中不同:
#include"iostream"
using namespace std;
// c语言中返回的是变量的值
// c++中表达式返回的是变量的本身
//实现原理: 即等号左侧是一个内存的首地址 即指针
//在c语言中如何实现跟c++中同样的效果呢,*(a < b ? &a : &b) = 30
void main05()
{
int a = 10;
int b = 20;
//判断a是否<b 若为真将30赋值给a 反之赋值b为30
(a < b ? a : b) = 30;
cout << a << endl;
system("pause");
}
const的使用方式
#include"iostream"
using namespace std;
struct Teacher
{
char name[64];
int age;
};
//这里const修饰的是指针指向的内存空间无法修改
int printTeacher01 (const Teacher*pt)
{
//pt->age = 10;//err
return 0;
}
//这里的const修饰的是指针变量本身 指针的指向不能修改
int printTeacher02( Teacher* const pt)
{
pt->age = 10;//true
//tp = NULL;//err
return 0;
}
//两者都不能被修改
int printTeacher03(const Teacher* const pt)
{
//pt->age = 10;//err
//tp = NULL;//err
cout << pt->age << endl;
return 0;
}
void main0601()
{
//const int a = 1;
//int const b = 2;//两种修饰效果一致
//const int* c;//const修饰的指针所指向的内存空间 不可修改
//int* const d = &a;//修饰的是指针变量本身的指向不能被修改
//const int* const e;//指向的内存空间与指向都不能修改
Teacher t1;
t1.age = 31;
printTeacher03(&t1);
system("pause");
}
//c++编译器中const修饰的常量不能通过指针来修改 是真正的不可修改的
void main0602()
{
const int a = 10;
int* p = NULL;
p = (int*)&a;//会为p重新分配一个内存空间 而不是指向a
*p = 20;
printf("a=%d\n", a);
printf("*p=%d\n", *p);
system("pause");
}
// const与#define的相同之处
// 在编译预处理阶段 处理
#define d 20
void main0603()
{
int a = 10;
int b = 20;
//int arr[a + b];//err数组下标不可以用变量 Linux内核允许这种方式
//c和c++中不支持
const int c = 10;
//const int d = 20;
int arr[c + d];//true
system("pause");
}
//----------------------------------------------------------
// const定义的变量,由编译器处理,提供类型检查和作用域检查
void func1()
{
#define a 10
const int b = 20;
//#undef //确保这个宏只在当前函数作用域中生效
//#undef a 只卸载a这个宏 #undef 卸载所有的宏
}
//在func1中的宏定义也能在func2中生效
//func1中的const常量不能再func2中使用
void func2()
{
printf("a=%d\n", a);
//printf("b=%d\n", b);//err
}
int main0604()
{
func1();
func2();
return 0;
}
引用的概念:
引用所占用的空间大小与指针相同。
引用在C++中的内部实现其实是一个常量指针。
//c++中引用方式修改变量的值
void func (int& a)
{
a=5;
}
//c语言中指针方式修改变量的值
void func (int* a)
{
* a=5;
}
#include"iostream"
using namespace std;
//1.引用概念
void main0701()
{
int a = 10;
//引用的语法:type& name = var;
int& b = a; //给a起别名 为b
b = 100;//相当于给a改为100
printf("b:%d\n", b);
printf("a:%d\n", a);
a = 10;
printf("a:%d\n", a);
printf("b:%d\n", b);
}
//基础类型的引用
void myswap01(int a, int b)
{
int c = 0;
c = a;
a = b;
b = c;
}
void myswap02(int* a, int* b)
{
int c = 0;
c = *a;
*a = *b;
*b = c;
}
//引用方式 引用做函数参数时不需要进行初始化
void myswap03(int& a, int& b)
{
int c = 0;
c = a;
a = b;
b = c;
}
void main0702()
{
int x = 10;
int y = 20;
myswap01(x, y);
printf("x:%d,y:%d\n", x, y);
myswap02(&x, &y);
printf("x:%d,y:%d\n", x, y);
myswap03(x, y);//引用方式
printf("x:%d,y:%d\n", x, y);
system("pause");
}
//-----------------------------
//复杂数据类型
struct Teacher
{
char name[64];
int age;
};
void printT(Teacher* pt)
{
cout << pt->age << endl;
}
//pt是t1的别名 相当于修改了t1
void printT2(Teacher& pt)
{
pt.age = 33;
}
void printT3(Teacher pt)
{
cout << pt.age << endl;
pt.age = 34;//err修改的值不能反回到主函数
}
void main0703()
{
Teacher t1;
t1.age = 30;
printT(&t1);
printT2(t1); //pt是t1的别名
printT3(t1);//pt 是形参,t1拷贝一份数据给pt
cout << t1.age << endl;
system("pause");
}
引用作为函数的返回值
#include"iostream"
using namespace std;
int getA1()
{
int a;
a = 10;
return a;
}
//返回a的本身 a的一个副本
int& getA2()
{
int a;
a = 10;
return a;
}
int* getA3()
{
int a;
a = 10;
return &a;
}
//若返回栈变量 不能成为其他引用的初始值
void main0901()
{
int a1 = 0;
int a2 = 0;
a1 = getA1();
a2 = getA2();
int &a3 = getA2();//可能返回乱码 不建议这样使用
printf("a1:%d,a2:%d,a3:%d\n", a1, a2, a3);
system("pause");
}
//----------------------------
//变量是static 或者是全局变量
int j1()
{
static int a = 10;
a++;
return a;
}
int& j2()
{
static int a = 10;
a++;
return a;
}
void main0902()
{
int a1 = 10;
int a2 = 20;
a1 = j1();
a2 = j2();
int& a3 = j2();
printf("a1=%d\n", a1);
printf("a2=%d\n", a2);
printf("a3=%d\n", a3);
system("pause");
}
//-----------------------------------------
//函数当左值
//返回变量的值
int g1()
{
static int a = 10;
a++;
return a;
}
//返回变量本身
int& g2()
{
static int a = 10;
a++;
printf("a:%d\n", a);
return a;
}
void main0903(void)
{
//g1() = 100; err
//11 = 100 g1()=11
g2() = 100;//函数返回值是引用并且当左值
g2();
int c1 = g1();//函数返回值是引用并且当右值
int c2 = g2();
system("pause");
}
指针的引用
#include"iostream"
using namespace std;
struct Teacher
{
char name[64];
int age;
};
//在被调函数获取资源
int getTeacher(Teacher** p)
{
Teacher* temp = NULL;
if (p==NULL)
{
return -1;
}
temp = (Teacher*)malloc(sizeof(Teacher));
if (temp==NULL)
{
return -2;
}
temp->age = 33;
//p是实参地址 *实参地址 间接修改实参的值
*p = temp;
}
// 这里的 Teacher* 跟main函数中pt1的类型相同
int getTeacher2(Teacher*& myp)
{
//这里给myp赋值相当于给main函数中pt1赋值
myp = (Teacher*)malloc(sizeof(Teacher));
if (myp==NULL)
{
return -1;
}
myp->age = 36;
}
void FreeTeacher(Teacher* pt1)
{
if (pt1==NULL)
{
return;
}
free(pt1);
}
void main1001()
{
Teacher* pt1;
// 1.用c语言中的2级指针方式调用
getTeacher(&pt1);
cout << "pt1.age=" << pt1->age << endl;
FreeTeacher(pt1);
// 2.用C++中指针的引用方式调用
getTeacher2(pt1);
cout << "pt1.age=" << pt1->age << endl;
FreeTeacher(pt1);
system("pause");
}