c/c++
ForTodayzzZ
好好学习,安静读书
展开
-
new 和 malloc 内部的实现方式有什么区别?
new 和 malloc 内部的实现方式有什么区别?new 的功能是在堆区新建一个对象,并返回该对象的指针。所谓的【新建对象】的意思就是,将调用该类的构造函数,因为如果不构造的话,就不能称之为一个对象。而 malloc 只是机械的分配一块内存,如果用 mallco 在堆区创建一个对象的话,是不会调用构造函数的。严格说来用 malloc 不能算是新建了一个对象,只能说是分配了一块与该类对象匹配的内存而已,然后强行把它解释为【这是一个对象】,按这个逻辑来,也不存在构造函数什么事。同样的,用原创 2020-05-30 20:29:42 · 177 阅读 · 0 评论 -
c++中链表的实现,使用new动态内存
利用动态内存, 我们也可以做出链表, 可以不断增长的数组:#include <iostream>#include <cstdio>using namespace std;struct node{ //链表的节点 int data;//数据 int num;//节点编号 struct node *next;//指向下一个节点};int main(){ struct node *head/*头节点*/, *p, *原创 2020-05-30 20:25:27 · 3173 阅读 · 0 评论 -
c++中重载,覆盖,重定义之间的区别
类重载、覆盖、重定义之间的区别:重载指的是函数具有的不同的参数列表,而函数名相同的函数。重载要求参数列表必须不同,比如参数的类型不同、参数的个数不同、参数的顺序不同。如果仅仅是函数的返回值不同是没办法重载的,因为重载要求参数列表必须不同。(发生在同一个类里)覆盖是存在类中,子类重写从基类继承过来的函数。被重写的函数不能是static的。必须是virtual的。但是函数名、返回值、参数列表都必须和基类相同(发生在基类和子类)重定义也叫做隐藏,子类重新定义父类中有相同名称的非虚函数 ( 参数列表..原创 2020-05-24 23:43:57 · 163 阅读 · 0 评论 -
c++友元函数简单理解
友元函数的使用因为友元函数没有this指针,则参数要有三种情况:要访问非static成员时,需要对象做参数;要访问static成员或全局变量时,则不需要对象做参数;如果做参数的对象是全局对象,则不需要对象做参数.可以直接调用友元函数,不需要通过对象或指针实例代码:class INTEGER{ friend void Print(const INTEGER& obj);//声明友元函数};void Print(const INTEGER& obj.原创 2020-05-23 15:23:05 · 235 阅读 · 0 评论 -
c++中拷贝构造函数简单理解
C++ primer p406 :拷贝构造函数是一种特殊的构造函数,具有单个形参,该形参(常用const修饰)是对该类类型的引用。当定义一个新对象并用一个同类型的对象对它进行初始化时,将显示使用拷贝构造函数。当该类型的对象传递给函数或从函数返回该类型的对象时,将隐式调用拷贝构造函数。C++支持两种初始化形式:拷贝初始化int a = 5;和直接初始化int a(5);对于其他类型没有什么区别,对于类类型直接初始化直接调用实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数,也就是说:A ...原创 2020-05-20 14:56:06 · 106 阅读 · 0 评论 -
c++中内联函数
内联函数inline:引入内联函数的目的是为了解决程序中函数调用的效率问题,这么说吧,程序在编译器编译的时候,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体进行替换,而对于其他的函数,都是在运行时候才被替代。这其实就是个空间代价换时间的i节省。所以内联函数一般都是1-5行的小函数。在使用内联函数时要留神:1.在内联函数内不允许使用循环语句和开关语句; 2.内联函数的定义必须出现在内联函数第一次调用之前; 3.类结构中所在的类说明内部定义的函数是内联函数。...原创 2020-05-19 18:12:20 · 121 阅读 · 0 评论 -
c++中的结构体和c语言中的结构体的区别
C++ 中的 struct 对 C 中的 struct 进行了扩充,它已经不再只是一个包含不同数据类型的数据结构了,它已经获取了太多的功能。struct 能包含成员函数吗? 能!struct 能继承吗? 能!!struct 能实现多态吗? 能!!!既然这些它都能实现,那它和 class 还能有什么区别?最本质的一个区别就是默认的访问控制,体现在两个方面:1)默认的继承访问权限。struct是public的,class是private的。你可以写如下的代码:struct A原创 2020-05-17 17:42:27 · 1265 阅读 · 2 评论 -
c/c++中.和箭头(——》)的区别以及用法
.与->运算符.(点)运算符和 ->(箭头)运算符用于引用类、结构和共用体的成员: 点运算符应用于实际的对象。箭头运算符与一个指向对象的指针一起使用。例如,假设有下面的结构:struct Employee { char first_name[16]; int age;} emp;.点运算符下面的代码把值 zara 赋给对象 emp 的 first_name 成员:strcpy(emp.first_name, "zara");->箭头运算...原创 2020-05-17 13:36:11 · 5143 阅读 · 0 评论 -
指针常量和常量指针详解
常量指针定义:又叫常指针,可以理解为常量的指针,也即这个是指针,但指向的是个常量,这个常量是指针的值(地址),而不是地址指向的值。关键点:1.常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改; 2.常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值; 3.指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址; 代码形式:int const* p; const int* p;指针常量定义:本质是一个常量,而.原创 2020-05-14 09:54:23 · 6424 阅读 · 6 评论 -
C++ 中常见的几种输入字符串的方法:cin、cin.get()、cin.getline()、getline()、gets()、getchar()
1. cin>>用法一:最常用、最基本的用法,输入一个数字:#include <iostream>using namespace std;int main (){ int a,b; cin>>a>>b; cout<<a+b<<endl;}//输入:2[回车]3[回车]//输出:5用法二:接受一个字符串,遇“空格”、“Tab”、“回车”都结束#include <iostream>原创 2020-05-11 16:18:42 · 310 阅读 · 3 评论 -
c++使用string创建字符串
第一:字符串的创建!1.以 a 为原字符 4单位大小string a(4,'a');cout<<a<<endl;aaaa2.任意大小的字符串string b("bbbbbb");cout<<b<<endl;bbbbbb3.把某一字符串的某一部分(0位置开始4个长度)给cstring c(a,0,4) ;cout<<c<<endl;aaaa4. 10长度原长度不足补*;c.resize(10,原创 2020-05-11 15:50:19 · 3573 阅读 · 0 评论 -
c语言c++ 从函数返回数组
c语言c++ 从函数返回数组c++不允许返回一个完整的数组,因此通过指定不带索引的数组名来返回一个指向数组的指针,举个例子:int * myFunction(){..}另外,C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量。举例实例:#include <iostream>#include <cstdlib>#include <ctime>using namespace std;// 要生成和返回随机数的函数..原创 2020-05-10 10:05:30 · 146 阅读 · 0 评论 -
c/c++传递数组给函数的三种方法
c++传递数组给函数的三种方法:c++中您可以通过指定不带索引的数组名来传递一个指向数组的指针。传递数组给函数,数组类型会自动转化为指针类型,因而传的实际是地址。方式1:形式参数是一个指针void myFunction(int *param){..}方式 2形式参数是一个已定义大小的数组:void myFunction(int param[10]){..}方式 3形式参数是一个未定义大小的数组:void myFunction(int param[]){..}..原创 2020-05-10 07:25:56 · 2275 阅读 · 0 评论 -
c/c++ 引用和指针的区别
C++引用引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。C++ 引用 vs 指针引用很容易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。 一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。 引用必须在创建时被初始化。指针可以在任何时间被初始化。...原创 2020-05-09 17:14:07 · 78 阅读 · 0 评论 -
c++中const修饰类成员函数
const 修饰类成员函数,其目的是防止成员函数修改被调用对象的值,如果我们不想修改一个调用对象的值,所有的成员函数都应当声明为 const 成员函数。注意:const 关键字不能与 static 关键字同时使用,因为 static 关键字修饰静态成员函数,静态成员函数不含有 this 指针,即不能实例化,const 成员函数必须具体到某一实例。下面的 get_cm()const; 函数用到了 const 成员函数:#include<iostream> using namesp原创 2020-05-09 01:19:30 · 442 阅读 · 0 评论 -
c/c++中const参数传递和函数返回值
对于 const 修饰函数参数可以分为三种情况。A:值传递的 const 修饰传递,一般这种情况不需要 const 修饰,因为函数会自动产生临时变量复制实参值。#include<iostream> using namespace std; void Cpf(const int a){ cout<<a; // ++a; 是错误的,a 不能被改变} int main(void) { Cpf(8); system("pause原创 2020-05-09 01:17:33 · 930 阅读 · 0 评论 -
C++ 随机数
在许多情况下,需要生成随机数。关于随机数生成器,有两个相关的函数。一个是rand(),该函数只返回一个伪随机数。生成随机数之前必须先调用srand()函数。下面是一个关于生成随机数的简单实例。实例中使用了time()函数来获取系统时间的秒数,通过调用 rand() 函数来生成随机数:实例#include <iostream>#include <ctime>#include <cstdlib> using namespace std; i...转载 2020-05-08 22:18:21 · 130 阅读 · 0 评论 -
c/c++中const char*, char const*, char*const 的区别
Bjarne在他的The C++ Programming Language里面给出过一个助记的方法:把一个声明从右向左读。char * const cp; ( * 读成 pointer to ) cp is a const pointer to char const char * p; p is a pointer to const char; char const * p; ...原创 2020-05-08 13:40:11 · 4892 阅读 · 0 评论 -
c/c++中宏定义 #define 和常量 const 的区别
类型和安全检查不同宏定义是字符替换,没有数据类型的区别,同时这种替换没有类型安全检查,可能产生边际效应等错误;const常量是常量的声明,有类型区别,需要在编译阶段进行类型检查编译器处理不同宏定义是一个"编译时"概念,在预处理阶段展开,不能对宏定义进行调试,生命周期结束与编译时期;const常量是一个"运行时"概念,在程序运行使用,类似于一个只读行数据存储方式不同宏定义...原创 2020-05-08 12:17:42 · 173 阅读 · 0 评论 -
c/c++中全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域的区别与联系
C++ 变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为 6 种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。从作用域看:全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。静态局部变量具有局部作用域,它只被初始化一次,自从第...原创 2020-05-08 11:42:01 · 2980 阅读 · 0 评论 -
C语言中变量的声明、定义和初始化的区别
变量定义:用于为变量分配存储空间,还可为变量指定初始值。程序中,变量有且仅有一个定义。变量声明:用于向程序表明变量的类型和名字。变量初始化:就是给变量赋值。定义也是声明,extern声明不是定义,变量在使用前就要被定义或者声明。在一个程序中,变量只能定义一次,却可以声明多次。定义分配存储空间,而声明不会。定义完之后才能初始化,所以初始化的时候已经分配内存...原创 2020-05-07 00:05:45 · 2655 阅读 · 0 评论 -
c/c++函数传值的三种方式:值传递,指针传递,引用传递(引用传递只在c++中有)
1. 值传递由于值传递是单向传递,传递过程中只是改变了形参的数值,并未改变实参的数值,因此并不会改变a和b原有的值。#include <stdio.h>void swap(int x, int y);void swap(int x, int y){int temp;temp = x;x = y;y = temp;}int ...原创 2020-05-06 23:49:45 · 401 阅读 · 0 评论 -
C 语言整数转字符串(拓展函数 itoa)的源码实现
itoa (表示 integer to alphanumeric)是把整型数转换成字符串的一个函数。在<stdlib.h> 头文件中使用方法:char* itoa(int value,char*string,int radix);//value: 要转换的整数,string: 转换后的字符串,radix: 转换进制数,如2,8,10,16 进制等。函数源码:char...原创 2020-05-04 17:08:37 · 925 阅读 · 0 评论 -
(多次回顾总结)C 语言中全局变量、局部变量、静态全局变量、静态局部变量的区别
从作用域看:1、全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包含全局变量定义的源文件需要用extern 关键字再次声明这个全局变量。2、静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。3、局部变量...原创 2020-05-04 10:08:52 · 174 阅读 · 0 评论 -
C 存储类(auto register static extern)的对比记录
auto 存储类auto存储类是所有局部变量默认的存储类。register 存储类register存储类用于定义存储在寄存器中而不是 RAM 中的局部变量。代表了寄存器变量,不在内存中使用;static 存储类static存储类指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。因此,使用 static 修饰局部变量可以在函数...原创 2020-05-04 10:06:37 · 128 阅读 · 0 评论 -
c语言标准库中断言(assert)的用法
assert() 宏的声明:void assert(int expression);expression-- 这可以是一个变量或任何 C 表达式。如果expression为 TRUE,assert() 不执行任何动作。如果expression为 FALSE,assert() 会在标准错误 stderr 上显示错误消息,并中止程序执行。例如:#include <a...原创 2020-05-03 17:16:27 · 446 阅读 · 0 评论 -
c语言输入输出总结scanf,printf,getchar,putchar,gets,puts
一.scanf()&printf()函数scanf() 函数用于从标准输入(键盘)读取并格式化, printf() 函数发送格式化输出到标准输出(屏幕)。 scanf()函数原型为int scanf(char const* const _Format,...),printf()函数原型为int printf(char const* const _Format,...)。sca...原创 2020-05-03 17:03:01 · 1207 阅读 · 0 评论 -
c语言中字符串的数组格式和指针格式下的sizeof和strlen的大小问题
c语言中没有string类型的格式,字符串有两种表示方法数组方式:char a[] = "wasd";指针格式:char *a = "wasd";下面举个例子,使用字符数组申明字符的时候数组下标可以不写数组的大小,但是写的话必须比字符个数大1,包含有\0无论是数组申明还是指针申明的字符串,strlen()的大小都是字符数,字符串指针时sizeof(指针名)输出的是指针的大小,一般是四...原创 2020-05-03 13:38:50 · 675 阅读 · 3 评论 -
c语言指针数组和数组指针的区别以及各自特点
数组指针(也称行指针)定义 int (*p)[n];()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。如要将二维数组赋给一指针,应这样赋值:int a[3][4];int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。p=a; //将该二...原创 2020-05-02 22:36:18 · 344 阅读 · 0 评论 -
c语言中函数的变量申明在函数名和大括号中间
今天看到一个例子,函数定义的时候将传递的参数申明放在了函数名和函数体大括号{}之间,于是搜索一下这是怎么回事,整理大概如下:这是老式函数定义叫做K&RC式样的函数定义格式为函数参数表里只写参数名参数在参数表的小括号后面定义(声明);参数声明语句(若干个),有语句结束符分号;然后才是函数体通俗来说就是一个老试的定义方式:例子:#include <...原创 2020-05-02 22:30:56 · 3458 阅读 · 4 评论