【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-11-10 02:46:15

【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);

【Cpp】考点·函数重载

一.什么是函数重载 函数重载(overloaded)是指,在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数.这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处. 举个栗子 1 #include<iostream> 2 using namespace std; 3 4 void print(int i) 5 { 6 cout << "print a integer: &qu

【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

c++解释--百度百科

c++ C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛:C++支持多种编程范式 --面向对象编程.泛型编程和过程化编程.最新正式标准C++于2014年8月18日公布.[1]  其编程领域众广,常用于系统开发,引擎开发等应用领域,是至今为止最受广大程序员受用的最强大编程语言之一,支持类:类.封装.重载等特性! 中文名 C++语言 外文名 The C++ Programming Language 类    别 计算机程序设计语言 创始人 Bjarne Stroustrup 创始公司 贝

C++中模板与泛型编程

目录 定义一个通用模板 模板特化和偏特化 模板实例化与匹配 可变参数模板 泛型编程是指独立与任何类型的方式编写代码.泛型编程和面向对象编程,都依赖与某种形式的多态.面向对象编程的多态性在运行时应用于存在继承关系的类,一段代码可以可以忽略基类和派生类之间的差异.在泛型编程中,编写的代码可以用作多种类型的对象.面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性. 1 模板定义 1.1 函数模板 模板定义以关键字 template 开始,后接模板形参表,模

[转]什么是C++虚函数、虚函数的作用和使用方法

我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是“重复定义”.但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能不同的函数.例如在例12.1(具体代码请查看:C++多态性的一个典型例子)程序中,在Circle类中定义了 area函数,在Circle类的派生类Cylinder中也定义了一个area函数.这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的.前者的作用是求圆面积,后者的作用是求圆柱体的表面积

第9课 函数重载分析(下)

1. 重载与函数指针 (1)将重载函数名赋值给函数指针时 ①根据重载规则挑选与函数指针参数列表一致的候选者 ②严格匹配候选者的函数类型与函数指针的函数类型(所谓严格匹配,即函数参数及返回值都匹配) [编程实验]函数重载 VS 函数指针 #include <stdio.h> #include <string.h> int func(int x) { return x; } int func(int a, int b) { return a + b; } int func(const

C++基础 易忘

1.const 修饰符:C语言中习惯用#define来定义常量,例如#define PI 3.14 C++提供了一种更加安全(这里的安全是指在替换的时候#define可能出错),更灵活的方式定义常量,用const修饰符,如:const float PI=3.14;这个常量 PI 是类型化的,它有地址,可以用指针指向它,但是不修改它(因此C++推荐使用const). (1).指向常量的指针:如,const char* p="abc";注意,这里指针p的值可以改变,但是不能改变p指向的常量

拷贝构造,深度拷贝,关于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.第二种初始化的方式是直