【C/C++学院】0813-C与CPP不同以及命名空间简介/函数重载与函数默认参数/泛型auto/Newdelete

C与CPP不同以及命名空间简介

命名空间在软件设计中的作用就是为了实现迭代式开发。

命名空间的别名

#include <iostream>

namespace runrunrunrun
{

	int a(10);
	char *str("gogogo");
	namespace run   //命名空间的嵌套
	{
		int a(9);
	}
}
namespace runrunrunrun  //命名空间的拓展
{
	int  y(5);
	//int  a(15);重定义错误
}
namespace r = runrunrunrun;//给命名空间起一个别名

void main132()
{
	std::cout << r::run::a << std::endl;//命名空间可以嵌套
	std::cout << r::y << std::endl;
	std::cout << r::a << std::endl;
}

//using namespace r;
void main11()
{
	//std::cout << r::a <<r::str<< std::endl;
	//std::cout << a << str << std::endl;

}

命名空间软件开发注意事项

#include <iostream>

namespace runmove
{
	int  y(5);
	int(*padd)(int, int);//函数指针接口
//private: 命名空间是透明的
	int  y1(5);
	class myclass
	{
	public://类默认是私有,实现封装
		int a;
	};
}

int add(int a, int b)
{

	return a + b;
}
int addp(int a, int b)
{
	std::cout << a << b;
	return a + b;
}
struct MyStruct
{
	int b;//结构体默认是透明的
private:
	int a;//是私有
};

void main1123()
{
	//namespace所有数据,函数,类,对象都是共有
	MyStruct struct1;//结构体内部默认公有
	struct1.b;

}

Using作用域

#include<iostream>
#include<stdlib.h>
namespace mydata
{
	int a(6);
}
namespace yourdata
{
	int a(8);
}
using namespace mydata;//using必须在命名空间的后面,作用域
using namespace yourdata;
//using如果变量重名,会出现不明确错误,加上命名空间修饰符
void go()
{
	//命名空间如果在块语句内容,作用域是定义开始到块语句结束
	std::cout << mydata::a << std::endl;
}

//using namespace mydata;//作用域为从代码开始到结束
void main()
{
	//std::cout << mydata::a << std::endl;
	std::cout <<yourdata::a << std::endl;

	system("pause");
}

函数重载与函数默认参数

函数重载原理

#include<iostream>
#include<stdio.h>

//参数的个数,参数的类型不同,顺序不同,与返回值无关
void go(int a)
{
	std::cout << a;
}

void go(double a)
{
	std::cout << a;
}

void go(double a,int b )
{
	std::cout << a << b;
}

void go(int  a, double b)
{
	std::cout << a << b;
}

//int go(double a)
//{
//
//
//}

//void go(int a,int b)
//{
//
//}

void main()
{
	void(*pgo1)(int a)=go;
	void(*pgo2)(double a)=go;
	void(*pgo3)(double a, int b)=go;
	void(*pgo4)(int  a, double b)=go;
	printf("%p\n",pgo1);
	printf("%p\n", pgo2);
	printf("%p\n", pgo3);
	printf("%p\n", pgo4);

	getchar();
}

默认参数

#include<stdio.h>
#include<stdlib.h>
#include<iostream>

//默认参数必须放在右边,因为参数的入栈顺序是从右至左
//默认参数中间不允许出现不默认的

void print(int c,int a = 1, int d=2, int b = 3)
{
	std::cout << a<<b<<c << std::endl;
}

void print(double c)
{

}

void main()
{
	//print(1,2,3);
	//函数指针没有默认参数,必须全部输入数据
	//函数重载与函数默认参数冲突,需要你输入的参数类型不一个,个数不一样,顺序不一样不会出现问题,否则一定报错
	void(*pt1)(int c, int a , int d , int b ) = print;
	pt1(100,1,2,3);//函数指针调用,没有用默认的

	print(100);

	system("pause");
}

泛型auto

#include<iostream>
#include<stdlib.h>
//自动变量,自动获取类型,输出,泛型
//自动变量,可以实现自动循环一维数组
//自动循环的时候,对应的必须是常量

void main1()
{
	auto num = 10.9;//自动变量,自动匹配类型
	auto numA = 10/3.0;
	std::cout << num <<"     " << numA << std::endl;
	system("pause");
}

void main()
{
	//int num[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	double num[2][5] = { 1.0, 2.0, 3.0, 4.5, 5, 6, 7, 8, 9, 10 };
	//num数组名是一个指针常量
	//auto 自动循环 begin  endl;,必须是一个数组的常量
	//
	for (auto data : num)//泛型C++语法,循环一维数组,常量
	{
		std::cout << data<<std::endl;

		for (int i = 0; i < 5; i++)
		{
			std::cout << *(data + i) << std::endl;
		}
	}
	system("pause");
}

Newdelete

对象数组

#include <iostream>
#include<stdlib.h>

class tansheng1
{
	int *p;
	int length;
public:
	tansheng1()//构建的时候初始化
	{
		std::cout << "谭胜被创建1"<<std::endl;
	}
	~tansheng1()//删除的时候释放内存
	{
		std::cout << "谭胜被销毁1" << std::endl;
	}
};

void main()
{
	tansheng1 *p = new tansheng1[3];
	delete  []p;//基本数据类型,delete,复杂类型必须[]
	system("pause");
}

New只能分配线程的内存

#include<stdio.h>
#include<stdlib.h>
#include<iostream>

void main1()
{
	int num=10;//栈上
	int *p = new int;//堆上
	*p = 5;
	std::cout << *p << "  " << p << std::endl;
	delete p;
//	delete p;//只能释放一次
	std::cout << p << std::endl;

	system("pause");
}

void  main2()
{
	//int num[10];
	int *p = new int[10];
	//int i = 0;
	std::cout << p << std::endl;

	for (int i = 0; i < 10; i++)
	{
		p[i] = i;
		std::cout << p[i] << std::endl;
	}
	delete []p;//删除数组的空间
	std::cout << p << std::endl;

	system("pause");
}

void main3()
{
	int *p = new int[80];
	int(*px)[10] = (int(*)[10]) p;
	//int(*px)[10] = new int[80];new只能分配线性

	int data = 0;
	for (int i = 0; i < 8; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			px[i][j] = data++;
			std::cout << " " << px[i][j];
		}
		std::cout<<std::endl;
	}

	system("pause");
}

Newdelete重载

#include <iostream>
#include<stdlib.h>

class tansheng
{
public:
	static int jishuqi;//静态
	int *p;
	int length;
public:
	tansheng()//构建的时候初始化
	{
		std::cout << "谭胜被创建2" << std::endl;
	}
	~tansheng()//删除的时候释放内存
	{
		std::cout << "谭胜被销毁2" << std::endl;
	}

	static void * operator new(size_t size)
	{
		jishuqi += 1;
		std::cout << "对象被创建2" << std::endl;
		tansheng *ptemp = ::new tansheng;//劫持
		return ptemp;
	}

	static void  operator delete(void *p)
	{
		jishuqi -= 1;
		std::cout << "对象被销毁2" << std::endl;
		::delete p;//::全局
	}
};

int tansheng::jishuqi = 0;
//类的内部的new没有完成分配内存的动作
//通往全局的new中间做了一个劫持

//空类占一个字节,表示自己存在
//类的对象,数据是独立,代码是共享的
//没有分配内存,构造函数无意义
class MyClass
{
	int num;
public:
	MyClass();
	~MyClass();

private:

};

MyClass::MyClass()
{
}

MyClass::~MyClass()
{
}

void main()
{

	tansheng * p1 = new tansheng;
	tansheng * p2 = new tansheng;
	tansheng * p3 = new tansheng;
	tansheng * p4 = new tansheng;
	std::cout << p1 << p2 << std::endl;
	delete p1;
	delete p2;
	std::cout << tansheng::jishuqi << std::endl;
	std::cout <<"myclass size"<<sizeof(MyClass) << std::endl;

	system("pause");
}
时间: 2024-08-30 18:44:07

【C/C++学院】0813-C与CPP不同以及命名空间简介/函数重载与函数默认参数/泛型auto/Newdelete的相关文章

【C/C++学院】0819-/类的成员函数与const-mutable /构造与析构/拷贝构造deletedefault以及深浅拷贝/静态成员函数成员变量类在内存的存储默认参数/友元类以及友元函数

类的成员函数与const-mutable  成员函数 Fushu.h #pragma once #include <iostream> class fushu { public: int x; int y; public: fushu(); ~fushu(); void show(); inline void showall(int x, int y);//显式内联 void setxy(int x, int y);//编译器优化,默认隐式内联 void show(int x, int y);

【C/C++学院】0823-静态联合编译与动态联合编译/父类指针子类指针释放/虚函数/纯虚函数概念以及虚析构函数/抽象类与纯虚函数以及应用/虚函数原理/虚函数分层以及异质链表/类模板的概念以及应用

静态联合编译与动态联合编译 #include <iostream> #include <stdlib.h> //散列 void go(int num) { } void go(char *str) { } //class //::在一个类中 class A { public: void go(int num) { } void go(char *str) { } }; void main() { ///auto p = go;编译的阶段,静态联编 void(*p1)(char *s

设置-如何在.Cpp程序中调用.c程序中的函数?

问题描述 如何在.Cpp程序中调用.c程序中的函数? 我在软件中需要把mp3文件转换成wav文件.为此从网上下载了一个转换程序.但把这些转换程序的文件加入到我的用VC6.0编写的MFC工程中后却发现编译通不过.为此,我把Project Settings中这些文件对应的Precompiled Headers都设置成Not using precompiled headers.这样,编译能通过了.但连接却通不过.我的具体程序和现象如下: 我在我的一个.cpp文件中需要调用如下函数: BOOL mp3T

C++:虚函数(virtual function)缺省参数的异常表现及正确使用

避免定义基类(base class)虚函数的缺省参数, 如果基类虚函数包含缺省参数, 派生类不要重新定义, 会产生异常; 虚函数(virtual)是动态绑定(dynamically bound),缺省参数是静态绑定(statically bound). 如果派生类(derived class)重新定义缺省值, 实例化, 执行函数正常; 但在动态绑定时, 会出现,执行基类的缺省参数, 却是派生类的行为, 这样的异常举动. talk is cheap, show you the code. 注意观察

后台开发:核心技术与应用实践

后台开发:核心技术与应用实践 徐晓鑫 著 图书在版编目(CIP)数据 后台开发:核心技术与应用实践 / 徐晓鑫著. -北京:机械工业出版社,2016.8 ISBN 978-7-111-54339-8 I. 后- II. 徐- III. 网络-开发 IV. TP393.092 中国版本图书馆CIP数据核字(2016)第167884号 后台开发:核心技术与应用实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:李 艺 责任校对:董纪丽 印 刷: 版 次:

C&amp;amp;C++混合编程

首先,混合编程不是指在同一个文件里写C与C++. 混合编程包括:1,C++引用C的头文件:2,g++生成的.o与gcc生成的.o相链接. 一.extern"C"的作用(最重点)     1. extern "C"的真实目的是实现类C和C++的混合编程.extern "C"是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数.extern "C"后面的函数不使用的C++的名字修饰,而是用C.这是因为C++编译后库

拷贝构造,深度拷贝,关于delete和default相关的操作,explicit,类赋初值,构造函数和析构函数,成员函数和内联函数,关于内存存储,默认参数,静态函数和普通函数,const函数,友元

 1.拷贝构造 //拷贝构造的规则,有两种方式实现初始化. //1.一个是通过在后面:a(x),b(y)的方式实现初始化. //2.第二种初始化的方式是直接在构造方法里面实现初始化. 案例如下: #include<iostream> //如果声明已经定义,边不会生成 class classA { private: int a; int b; public: //拷贝构造的规则,有两种方式实现初始化 //1.一个是通过在后面:a(x),b(y)的方式实现初始化 //2.第二种初始化的方式是直

深度探究C++中的函数重载的用法_C 语言

C++ 允许同一范围内具有相同名称的多个函数的规范.这些函数称为重载函数,"重载"中对其进行了详细介绍.利用重载函数,程序员可以根据参数的类型和数量为函数提供不同的语义. 例如,采用字符串(或 char *)参数的 print 函数执行的任务与采用"双精度"类型的参数的函数执行的任务截然不同.重载允许通用命名并使程序员无需创建名称,例如 print_sz 或 print_d.下表显示了 C++ 使用函数声明的哪些部分来区分同一范围内具有相同名称的函数组.重载注意事项

实例讲解在C++的函数中变量参数及默认参数的使用_C 语言

包含变量参数列表的函数如果函数声明中最后一个成员是省略号 (...),则函数声明可采用数量可变的参数.在这些情况下,C++ 只为显式声明的参数提供类型检查.即使参数的数量和类型是可变的,在需要使函数泛化时也可使用变量参数列表.函数的系列是一个使用变量参数列表的函数的示例.printfargument-declaration-list 包含变量参数的函数 若要访问声明后的参数,请使用包含在标准包含文件 STDARG.H 中的宏(如下所述). 采用数量可变的参数的函数声明至少需要一个占位符参数(即使