palm3D
palm3D

Reputation: 8240

C++ cast syntax styles

A question related to Regular cast vs. static_cast vs. dynamic_cast:

What cast syntax style do you prefer in C++?

They may not translate to exactly the same instructions (do they?) but their effect should be the same (right?).

If you're just casting between the built-in numeric types, I find C++-style cast syntax too verbose. As a former Java coder I tend to use C-style cast syntax instead, but my local C++ guru insists on using constructor syntax.

What do you think?

Upvotes: 40

Views: 20068

Answers (10)

QBziZ
QBziZ

Reputation: 3250

The constructor syntax. C++ is OO, constructors exist, I use them. If you feel the need to annotate these conversion ctor's you should do it for every type, not just the built-in ones. Maybe you use the 'explicit' keyword for conversion ctors but the client syntax mimics exactly what the ctor syntax for built-in types does. Being greppable, that may be true, but what a big surprise that typing more characters makes searches easy. Why treat these ones as special? If you are writing math formulas with lots of int/unsigned/... to and from double/float - graphics - and you need to write a static_cast every time, the look of the formula gets cluttered and is very much unreadable. And it's an uphill battle anyway as a lot of times you will convert without even noticing that you are. For downcasting pointers I do use the static_cast as of course no ctor exists by default that would do that.

Upvotes: 3

Konrad Rudolph
Konrad Rudolph

Reputation: 545518

It's best practice never to use C-style casts for three main reasons:

  • as already mentioned, no checking is performed here. The programmer simply cannot know which of the various casts is used which weakens strong typing
  • the new casts are intentionally visually striking. Since casts often reveal a weakness in the code, it's argued that making casts visible in the code is a good thing.
  • this is especially true if searching for casts with an automated tool. Finding C-style casts reliably is nearly impossible.

As palm3D noted:

I find C++-style cast syntax too verbose.

This is intentional, for the reasons given above.

The constructor syntax (official name: function-style cast) is semantically the same as the C-style cast and should be avoided as well (except for variable initializations on declaration), for the same reasons. It is debatable whether this should be true even for types that define custom constructors but in Effective C++, Meyers argues that even in those cases you should refrain from using them. To illustrate:

void f(auto_ptr<int> x);

f(static_cast<auto_ptr<int> >(new int(5))); // GOOD
f(auto_ptr<int>(new int(5));                // BAD

The static_cast here will actually call the auto_ptr constructor.

Upvotes: 62

CAH
CAH

Reputation: 11

Go for C++ style and, at worse, the ugly verbose code snippets that comprised C++'s explicit typecast will be a constant reminder of what we all know (i.e explicit casting is bad -- the lead to the coin-ing of expletives). Do not go with C++ style if you want to master the art of tracking runtime errors.

Upvotes: 1

Graeme Perrow
Graeme Perrow

Reputation: 57238

We currently use C-style casts everywhere. I asked the other casting question, and I now see the advantage of using static_cast instead, if for no other reason than it's "greppable" (I like that term). I will probably start using that.

I don't like the C++ style; it looks too much like a function call.

Upvotes: 1

J&#233;r&#244;me
J&#233;r&#244;me

Reputation: 27027

Regarding this subject, I'm following the recommandations made by Scott Meyers (More Effective C++, Item 2 : Prefer C++-style casts).

I agree that C++ style cast are verbose, but that's what I like about them : they are very easy to spot, and they make the code easier to read (which is more important than writing).

They also force you to think about what kind of cast you need, and to chose the right one, reducing the risk of mistakes. They will also help you detecting errors at compile time instead at runtime.

Upvotes: 8

Ben Collins
Ben Collins

Reputation: 20686

Definitely C++-style. The extra typing will help prevent you from casting when you shouldn't :-)

Upvotes: 4

Bill the Lizard
Bill the Lizard

Reputation: 405715

I use static_cast for two reasons.

  1. It's explicitly clear what's taking place. I can't read over that without realizing there's a cast going on. With C-style casts you eye can pass right over it without pause.
  2. It's easy to search for every place in my code where I'm casting.

Upvotes: 3

DrPizza
DrPizza

Reputation: 18340

C-style cast is the worst way to go. It's harder to see, ungreppable, conflates different actions that should not be conflated, and can't do everything that C++-style casts can do. They really should have removed C-style casts from the language.

Upvotes: 1

hometoast
hometoast

Reputation: 11782

According to Stroustrup:

The "new-style casts" were introduced to give programmers a chance to state their intentions more clearly and for the compiler to catch more errors.

So really, its for safety as it does extra compile-time checking.

Upvotes: 16

CiNN
CiNN

Reputation: 9870

C-style cast syntax, do not error check. C++-style cast syntax, does some checking. When using static_cast, even if it doesn't do checking, at least you know you should be carefull here.

Upvotes: 1

Related Questions