/*
1.const修饰符用法
2.内联函数
3.带默认参数的函数
4.函数的重载
5.作用域运算符::
6.共用体
7.运算符new和delete
8.引用
9.应用举例
*/
#include <iostream>
#include <cmath>
using namespace std;
void testFun1();
void testFun2();
void testFun3();
void testFun4();
void testFun5();
void testFun6();
void testFun7();
void testFun8();
void testFun9();
int main(int argc, const char * argv[]) {
// testFun1();
// testFun2();
// testFun3();
// testFun4();
// testFun5();
// testFun6();
// testFun7();
// testFun8();
testFun9();
return 0;
}
//1.const修饰符
void testFun1(){
// 1、定义常量
// (1)const修饰变量,以下两种定义形式在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。
int const Value1 = 10;
const int Value2 = 18;
// Value1 = 20; ❌
// Value2 = 30; ❌
cout<<Value1<<endl<<Value2<<endl;
// (2)将const改为外部连接,作用于扩大至全局,编译时会分配内存,并且可以不进行初始化,仅仅作为声明,编译器认为在程序其他地方进行了定义.
// extend const int ValueName = value;
//2、与指针结合
int a = 30;
int b = 60;
//1)指向常量的指针 指针的内容不能改变,但是指针的指向是可以改变的
const int *p1 = &a;
cout<<"address:"<<p1<<" value:"<<*p1<<endl;
p1 = &b;
// *p1 = b;❌
cout<<"address:"<<p1<<" value:"<<*p1<<endl;
const char *name = "fanhua";
name = "chendian";
cout<<name<<endl;
// name[0] = 'c';❌
//2)常指针 指针所指的内容可以改变,但是指针本身的指向不能改变
int *const p = &a;
cout<<"address:"<<p<<" value:"<<*p<<endl;
*p = b;
// p = &b; ❌
cout<<"address:"<<p<<" value:"<<*p<<endl;
char *const nickname = "fanhua";
// nickname = "chendian";❌
// nickname[0] = 'c';
cout<<nickname<<endl;
//3)指向常量的常指针 内容和指向都不能改变
const int* const p3 = &a;
// p3 = &b;❌
// *p3 = b;❌
cout<<"address:"<<p3<<" value:"<<*p3<<endl;
const char* const aliasname = "chen";
// aliasname[3] = 'd';❌
// aliasname = "zhang";❌
cout<<aliasname<<endl;
/*
const修饰指针变量时:
(1)只有一个const,如果const位于*左侧,表示指针所指数据是常量,不能通过解引用修改该数据;指针本身是变量,可以指向其他的内存单元。
(2)只有一个const,如果const位于*右侧,表示指针本身是常量,不能指向其他内存地址;指针所指的数据可以通过解引用修改。
(3)两个const,*左右各一个,表示指针和指针所指数据都不能修改。
*/
//3、与函数结合使用const
// void testModifyConst(const int x);在函数内部参数值不会改变;
}
/*
2.内联函数(内置函数)
声明 函数说明前冠以关键字 inline
每当程序中出现对该函数的调用时,C++编译器是函数体中的代码块插入到调用函数的语句处(相当于把代码复制一份到调用位置,而不发生真正的函数调用)。
作用:消除函数调用时候的系统开销,以提高程序的执行效率。在程序执行过程中调用函数时,系统将程序当前的一些状态信息存到栈中(例如现场和返回地址等),同时转到函数的代码处去执行函数体语句,这些参数的保存与传递的过程中须要时间和空间的开销,使得程序执行效率低。内联函数是一种牺牲空间换区时间的处理方法。
*/
inline int box(int a, int b, int c){
return a * b * c;
}
void testFun2(){
int e = box(1, 2, 3);
cout<<e<<endl;
}
/*
3.带默认参数的函数
*/
int sum(int a = 1, int b = 2, int c = 3){
return a + b + c;
}
void testFun3(){
int e = 0;
e = sum();
cout<<e<<endl;
e = sum(100);
cout<<e<<endl;
e = sum(100,300);
cout<<e<<endl;
e = sum(100,200,300);
cout<<e<<endl;
// e = sum(,200);❌
}
/**
4.函数的重载(注意:只有返回值不同构不成函数重载)
*/
int mul(int a, int b){
return a + b;
}
int mul(int a, int b, int c){
return a + b + c;
}
//float mul(float a, float b){
// return a + b;
//}
double mul(double a, double b){
return a + b;
}
float mul(float a, float b , float c, float d){
return a + b + c + d;
}
void testFun4(){
int e = 0;
float f = 0.0;
e = mul(2, 3);
cout<<e<<endl;
e = mul(2, 4, 5);
cout<<e<<endl;
double d = mul(2.4, 3.4);
cout<<d<<endl;
f = mul(2.4, 4.4, 5.5, 5.6);
cout<<f<<endl;
}
/*
5.作用域运算符::
*/
int avar = 1314;
void testFun5(){
int avar = 0;
avar = 520;
cout<<"lobal: "<<avar<<endl;
cout<<"global: "<<::avar<<endl;
::avar = 520;
cout<<"global: "<<::avar<<endl;
}
/*
6.共用体
*/
void testFun6(){
union data{
long int i;
double d;
char c;
};
//无名共用体
union {
int i;
double d;
float f;
}x;
cout<<sizeof(data)<<endl;
cout<<&x.i<<endl;
cout<<&x.d<<endl;
cout<<&x.f<<endl<<endl;
union data d;
d.c = 'a';
cout<<d.i<<endl;
cout<<d.d<<endl;
cout<<d.c<<endl<<endl;
// x.i = 65;
// cout<<x.i<<endl;
// cout<<x.d<<endl;
// cout<<x.f<<endl<<endl;
x.d = 65.0;
cout<<x.i<<endl;
cout<<x.d<<endl;
cout<<x.f<<endl;
}
/*
7.运算符new 与 delete 动态分配内存空间
*/
void testFun7(){
int *p;
p = new int(10);
if (!p) {
cout<<"allocaction failure!\n";
return;
}
cout<<*p<<endl;
cout<<p<<endl<<endl;
delete p;
p = new int;
*p = 520;
cout<<*p<<endl;
cout<<p<<endl<<endl;
delete p;
int *array = new int[3];
array[0] = 1;
array[1] = 2;
array[2] = 3;
for (int i = 0 ; i < 3; i++) {
cout<<array[i]<<endl;
}
delete [] array;
}
/*
8.引用
建立引用的作用是为变量另起一个名字,变量的引用通
常被认为是变量的别名。当生命了一个引用时,必须同
时用另一个变量名来将它初始化,即声明它代表哪一个变
量,是哪一个变量的别名。这样,对一个引用的所有操作,
实际上都是对其所代表的变量的操作,就如同对一个人来说,
即使有三四个名字,实际上就是同一个人,用这三四个名字
所做的事情,其实就是那一个人所做的事情。
类型 &引用名 = 已定义的变量名;
*/
void sample(){
int i;
int &j = i;
i = 30;
cout<<"i="<<i<<" j="<<j<<endl;
j = 50;
cout<<"i="<<i<<" j="<<j<<endl;
cout<<"变量 i 的地址: "<<&i<<endl;
cout<<"引用 j 的地址: "<<&j<<endl;
}
//引用作为函数参数
void swap(int &m , int &n){
int temp = m;
m = n;
n = temp;
}
//引用作为函数返回值
int &max(int &num1, int &num2){
return (num1>num2)?num1:num2;
}
int &min(int &num1, int &num2){
return num1<num2?num1:num2;
}
void testFun8(){
sample();
int num1 , num2;
cout<<"请输入第一个数:";
cin>>num1;
cout<<"请输入第二个数:";
cin>>num2;
cout<<"\n找出最大数,然后把最大数赋为0后,两个分别为:"<<endl;
max(num1, num2) = 0;
cout<<num1<<"和"<<num2<<endl;
cout<<"现在请再输入两个数:"<<endl;
cout<<"请输入第一个数:";
cin>>num1;
cout<<"请输入第二个数:";
cin>>num2;
cout<<"\n找出最小数,然后把最小数赋为0后,两个分别为:"<<endl;
min(num1, num2) = 0;
cout<<num1<<"和"<<num2<<endl;
}
/*
9.应用举例
*/
//1)引用的理解
int &f(int &i){
i += 10;
return i;
}
void testSample1(){
int k = 0;
int &m = f(k);
cout<<k<<endl;
m = 50;
cout<<k<<endl;
}
//2)用动态分配空间的方法计算Fibonacci数列的前20项
// 并存储到动态分配的空间中
/*
斐波那契(Fibonacci)数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
自然中的斐波那契数列
自然中的斐波那契数列
这个数列从第3项开始,每一项都等于前两项之和。
*/
void testSample2Fibonacci(){
int *p = new int[20];
*p = 1;
*(p + 1) = 1;
cout<<*p<<"\t"<<*(p + 1)<<"\t";
p = p + 2;
for (int i = 3; i <= 20; i++) {
*p = *(p - 1) + *(p - 2);
cout<<*p<<"\t";
if (i % 5 == 0) {
cout<<endl;
}
p++;
}
}
//3)百钱问题:将一元人民币兑换成1、2、5分硬币,有多少种换发?
void testSample3(){
int n_five;
int n_two;
int n_one;
int sum = 0;
for (n_five = 0; n_five <= 20; n_five++) {
for (n_two = 0; n_two <= 50; n_two++) {
n_one = 100 - n_five * 5 - n_two * 2;
if (n_one >= 0) {
cout<<"一分:"<<n_one<<"\t二分:"<<n_two<<"\t五分:"<<n_five<<endl;
sum++;
}
}
}
cout<<"sum = "<<sum<<endl;
}
//4)用二分法求解 f(x)=0 的根? 不理解
inline int fun(float x){
return 2 * x * x * x - 4 * x * x + 3 * x - 6;
}
void testSample4(){
float left, right, middle, ym, yl, yr;
cout<<"please two number :"<<endl;
cin>>left>>right;
yl = fun(left);
yr = fun(right);
do {
middle = (right + left)/2;
ym = fun(middle);
if (ym * yr > 0) {
right = middle;
yr = ym;
}else{
left = middle;
yl = ym;
}
} while (fabs(ym) >= 1e-6);
cout<<"\nRoot is : "<<middle<<endl;
}
void testFun9(){
testSample1();
cout<<"***********************"<<endl;
testSample2Fibonacci();
cout<<"***********************"<<endl;
testSample3();
cout<<"***********************"<<endl;
testSample4();
}
第二章 C++概述
最新推荐文章于 2024-08-14 20:46:00 发布