C++函数 加括号与不加括号

news2024/11/15 1:48:42

很多时候,我们会看到一些在创建对象时有的加括号有的不加括号

那么,这是什么情况呢?

总结:函数需要加上括号,加上括号会对函数初始化,不加括号可能导致未知错误

我们来验证一下。

1.基本数据类型不带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int a;
	cout << "a=" << a << endl;
	return 0;
}
调试结果:

2.基本数据类型带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int a();   // 这是一个返回值为 int 无参数的函数;
	return 0;
}
调试结果: 看注释

3.基本数据类型new创建不带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int *a = new int;
	cout << "a=" << *a << endl;
	return 0;
}
调试结果:这是个随机值

4.基本数据类型new创建带括号()

#include <iostream>
using namespace std;

int main(int arg, char **argv)
{
	int *a = new int();
	cout << "a=" << *a << endl;
	return 0;
}
调试结果:被初始化为 0

5.自定义数据类型不带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A a;
	cout << "value=" << a.value << endl;
	return 0;
}
调试结果:

6.自定义数据类型带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A a(); // 这是一个返回值类型为A的无参数函数
	return 0;
}
调试结果: 看注释

7.自定义数据类型new创建不带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A;
	cout << "value=" << a->value << endl;
	return 0;
}
调试结果:

8.自定义数据类型new创建带括号(),不提任何供构造函数

#include <iostream>
using namespace std;

class A {
public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A();
	cout << "value=" << a->value << endl;
	return 0;
}
调试结果:

9.自定义数据类型不带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A a;
	cout << "value=" << a.value << endl;
	return 0;
}
调试结果:

10.自定义数据类型带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A a();// 这是一个返回值类型为A的无参数函数
	//cout << "value=" << a.value << endl;
	return 0;
}
调试结果: 看注释

11.自定义数据类型new创建不带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A;
	cout << "value=" << a->value << endl;
	return 0;
}
调试结果:

12.自定义数据类型new创建带括号(),提供构造函数

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

int main(int arg, char **argv)
{
	A *a = new A();
	cout << "value=" << a->value << endl;
	return 0;
}
调试结果:

13.自定义数据类型new创建带括号(),提供构造函数,并是全局对象

#include <iostream>
using namespace std;

class A {
public:
	A() {};

public:
	int value;
};

A *a = new A();
int main(int arg, char **argv)
{	
	cout << "value=" << a->value << endl;
	return 0;
}
调试结果:

总结: 在编写类时,只有在不给该类显式提供构造函数并在 new 对象加上括号()时, 其类内部数据成员才会被定义,其余情况都是未定义行为!

尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。

尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。

尽量为该类编写构造函数并进行一系列的初始化和赋值操作,不要依赖系统默认未定义行为。


首先讨论各种构造函数

我们都知道,当我们不提供构造函数时,编译器会自动为我们添加一个默认无参构造函数和一个默认拷贝构造函数,例如:

class test {};
int main() {
    test A;//调用默认无参构造
    test B(A);//调用默认拷贝构造
    return 0;
}


当我们添加无参构造函数或者有参构造函数时,编译器将不再提供默认无参构造函数和但依旧会提供默认拷贝构造函数,例如:

//添加无参构造函数时
class test {
public:
    test() { cout << "无参构造" << endl;}
};
int main() {
    test A;//输出:无参构造
    test B(A);//无输出,调用默认拷贝构造
    return 0;
}


//添加有参构造函数时
class test {
public:
    int val;
    test(int _val) {
        val = _val;
        cout << "有参构造" << endl;
    }
};
int main() {
    //test A; 无法通过编译,此时没有无参构造
    test A(5);//输出:有参构造
    test B(A);//无输出,调用默认拷贝构造
    return 0;
}


而当我们添加拷贝构造函数时,编译器将不再提供任何默认构造函数,例如:

class test {
public:
    int val;
    test(int _val) {
        this->val = _val;
        cout << "有参构造" << endl;
    } //必须得添加无参构造或者有参构造,不然没法创建新对象
    test(test& T) {
        this->val = T.val;
        cout << "拷贝构造" << endl;
    }
};
int main() {
    //test A; 无法通过编译,此时没有无参构造。
    test A(5);//输出:“有参构造”
    test B(A);//输出:“拷贝构造”
    return 0;
}


新建对象时,如果使用无参构造,不添加括号。如果添加括号,编译器会认为这是函数申明,例如:

Test A;
Test A();//错误,此时编译器会认为这是函数申明,而不是无参构造


然后是new创建对象时是否添加括号

new创新新对象时,如果是内置类型,例如:int,是否添加括号都可以,添加括号会进行初始化,不添加则只是开辟空间。例如:

int* T = new int;//创建新对象,只是开辟空间
int* T = new int();//创建新对象并初始化

而对于new创建自定义对象时是否加括号,区别可以参见new对象加括号和不加括号的区别。总结就是,new创建新对象时最好加上括号。


当函数指针被赋值给另一个变量时函数调用不需要加括号

当函数指针被赋值给另一个变量时,函数调用不需要加括号是因为函数名本身就代表了函数的地址。通过将函数指针赋值给另一个变量,实际上是将函数的地址赋值给了这个变量。因此,可以直接通过这个变量来调用函数,而不需要使用括号。

这种方式可以用于实现回调函数或者动态选择要调用的函数的场景。通过将不同的函数指针赋值给同一个变量,可以在运行时决定要调用的具体函数,从而实现灵活的程序逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1516177.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux编程4.4 网络编程-通信架构

TCP客户端服务器编程模型 1、客户端调用序列 调用socket函数创建套接字调用connect连接服务器端调用I/O函数&#xff08;read/write&#xff09;与服务器端通讯调用close关闭套接字 2、服务器端调用序列 调用socket函数创建套接字调用bind绑定本地地址和端口调用listen启动…

阿里云国际放行DDoS高防回源IP

如果源站服务器上设置了IP白名单访问控制&#xff08;如安全软件、安全组&#xff09;&#xff0c;由于设置了DDoS高防后&#xff0c;回源IP是高防回源IP段&#xff0c;您需要将DDoS高防的回源IP段的地址加入安全软件和安全组的白名单中&#xff0c;避免DDoS高防的回源流量被误…

ElasticSearch之Nested对象

写在前面 本文看下es的nested嵌套对象相关内容。 1&#xff1a;es用了啥范式&#xff1f; 在关系型数据库中定义了6大数据库范式,即1&#xff0c;2&#xff0c;3&#xff0c;BC&#xff0c;4&#xff0c;5的NF&#xff08;normal form&#xff09;,分别如下&#xff1a; 1N…

每一位教师都应该学会的“夸夸术”

在教育领域&#xff0c;我们常常强调正面教育和激励教育的重要性。这其中&#xff0c;教师们的“夸夸术”——也就是赞美和表扬学生的技巧——无疑是极为关键的一环。掌握并运用好“夸夸术”&#xff0c;不仅可以激发学生的学习兴趣和自信心&#xff0c;还能培养他们积极向上的…

武汉星起航:秉承客户至上服务理念,为创业者打造坚实后盾

在跨境电商的激荡浪潮中&#xff0c;武汉星起航电子商务有限公司一直秉持着以客户为中心的发展理念&#xff0c;为跨境创业者提供了独特的支持和经验积累&#xff0c;公司通过多年的探索和实践&#xff0c;成功塑造了一个以卖家需求为导向的服务平台&#xff0c;为每一位创业者…

C#快速入门基础

本篇文章从最基础的C#编程开始学习&#xff0c;经过非常优秀的面向对象编程思想和方法的学习&#xff0c;为C#编程打下基础。 第 01 章 C#开发环境之VS使用和.NET平台基础 1.1 Visual Studio 开发环境 1.1.1 硬件环境 i5CPUi5CPU&#xff08;建议 4核 4线程或以上 &#xff0…

如何在Windows系统安装Node.js环境并制作html页面发布公网远程访问?

文章目录 前言1.安装Node.js环境2.创建node.js服务3. 访问node.js 服务4.内网穿透4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口 5.固定公网地址 前言 Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation&#xff0…

Pygame教程06:Event事件的类型+处理方法+监听鼠标事件

------------★Pygame系列教程★------------ Pygame教程01&#xff1a;初识pygame游戏模块 Pygame教程02&#xff1a;图片的加载缩放旋转显示操作 Pygame教程03&#xff1a;文本显示字体加载transform方法 Pygame教程04&#xff1a;draw方法绘制矩形、多边形、圆、椭圆、弧…

Redis到底是单线程还是多线程!,【工作感悟】

无论你是做 Python&#xff0c;PHP&#xff0c;JAVA&#xff0c;Go 还是 C#&#xff0c;Ruby 开发的&#xff0c;都离不开使用 Redis。 大部分程序员同学工作中都有用到 Redis&#xff0c;但是只限于会简单的使用&#xff0c;对Redis缺乏整体的认知。 无论是在大厂还是在中小…

Java面试题之线程

1. 进程和线程的区别 进程是资源分配的基本单位&#xff1b;线程是任务调度执行的基本单位&#xff1b;进程的创建和销毁消耗的资源都比线程要多&#xff1b;多个进程之间的内存资源是独立的&#xff1b;在一个进程中多个线程之间的内存资源是共享的&#xff1b; 一个进程中包…

Shell常用脚本:文件或目录一键同步到多台服务器

注意&#xff1a; 将本地文件&#xff0c;同步到【/opt/module/script/xsyncByFileIp.txt】里面的目标机器 xsyncByFile.sh #!/bin/bash# 入参参数个数 argsCount$#if(($argsCount0)); thenecho "同步失败&#xff1a;请输入待同步的文件或者目录" exit; fiecho &q…

分享几个Google Chrome谷歌浏览器历史版本下载网站

使用selenium模块的时候&#xff0c;从官网下载的谷歌浏览器版本太高&#xff0c;驱动不支持&#xff0c;所以需要使用历史的谷歌浏览器版本 &#xff0c;这里备份一下以防找不到了。 驱动下载地址&#xff1a;https://registry.npmmirror.com/binary.html?pathchromedriver 文…

低代码与AI:构建面向未来的智能化应用

引言 在当今数字时代&#xff0c;技术的快速发展为各行各业带来了前所未有的机遇和挑战。企业和组织面临着如何迅速开发和交付高质量应用的需求&#xff0c;同时还需要应对日益复杂的业务需求和用户期望。在这样的背景下&#xff0c;低代码与人工智能&#xff08;AI&#xff0…

打卡学习kubernetes——了解k8s基本概念

目录 1 Container 2 Pod 3 Node 4 Namespace 5 Service 6 Label 7 Annotations 8 Volume 1 Container Container(容器)是一种便携式、轻量级的操作系统级虚拟化技术。它使用namespace隔离不同的软件运行环境&#xff0c;并通过镜像自包含软件的运行环境&#xff0c;从而…

如何打造“标准化的仓库”?4个环节5大方面看这里...

仓库管理&#xff0c;在保障企业物流运作效率、降低运营成本、提高客户服务质量等方面发挥着不可替代的作用。标准化、规范化管理作为仓库管理中的重要手段&#xff0c;不仅能够提高管理效率&#xff0c;还能够有效地降低管理风险&#xff0c;使仓库运作更加安全、稳定、高效。…

数据结构:图及相关算法讲解

图 1.图的基本概念2. 图的存储结构2.1邻接矩阵2.2邻接表2.3两种实现的比较 3.图的遍历3.1 图的广度优先遍历3.2 图的深度优先遍历 4.最小生成树4.1 Kruskal算法4.2 Prim算法4.3 两个算法比较 5.最短路径5.1两个抽象存储5.2单源最短路径--Dijkstra算法5.3单源最短路径--Bellman-…

VScode(Python)使用ssh远程开发(Linux系统树莓派)时,配置falke8和yapf总结避坑!最详细,一步到位!

写在前面&#xff1a;在Windows系统下使用VScode时可以很舒服的使用flake8和yapf&#xff0c;但是在ssh远程开发树莓派时&#xff0c;我却用不了&#xff0c;总是出现问题。当时我就开始了漫长的探索求知之路。中间也请教过许多大佬&#xff0c;但是他们就讲“能用不就行了&…

51、WEB攻防——通用漏洞验证码识别复用调用找回密码重定向状态值

文章目录 回显状态判断用户名重定向验证码回显显示验证码简单机制验证码复用验证码智能识别验证码接口调用安全修复建议 回显状态判断 request前端判断不安全&#xff08;前端接收验证的返回值来进行判断)&#xff0c;使用burp的Response to this request可以抓取返回包~ 这种…

C#,数值计算,希尔伯特矩阵(Hilbert Matrix)的算法与源代码

Hilbert, David (1862-1943) 1 希尔伯特(Hilbert) 德国数学家,在《几何学基础》中提出了第一套严格的几何公理(1899年)。他还证明了自己的系统是自洽的。他发明了一条简单的空间填充曲线,即埃里克魏斯汀的数学世界,即希尔伯特曲线,埃里克魏斯汀的数学世界,并证明了不…

OpenCASCADE开发指南<七>:OCC 中的数学基本类型和数学算法

1 标准对象的集合容器 在处理现实问题时&#xff0c;经常将问题抽象成一个数学模型&#xff0c;接着对模型求解&#xff0c; 然后将解提取出来以解决现实问题。 其实在 CAD 软件中&#xff0c; 主要解决的就是数学模型。因此&#xff0c;本节将描述 OCC 的数学基本类型和数学算…